Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
791f51dcb4 | ||
|
|
4621f3ec5d | ||
|
|
ab9c09d0d9 | ||
|
|
dbf51c1c7d |
@@ -0,0 +1,168 @@
|
|||||||
|
# NOTE: This workflow was ported from Travis.
|
||||||
|
# Travis was using Ubuntu 14.04. Ubuntu 14.04 is not supportted by GitHub workflows. Ubuntu 20.04 is recommended.
|
||||||
|
# Travis was using Clang 3.6. The earliest version support by Ubuntu 20.04 is Clang 6.0.
|
||||||
|
# Travis was caching the clang package. APT package caching is not natively supported by GitHub actions/cache.
|
||||||
|
# Travis was using Mac OS X 10.13.6 / Xcode 9.4.1 / LLVM 9.1.0
|
||||||
|
|
||||||
|
# NOTE: The following documentation may be useful to maintainers of this workflow.
|
||||||
|
# Github actions: https://docs.github.com/en/actions
|
||||||
|
# Github github-script action: https://github.com/actions/github-script
|
||||||
|
# GitHub REST API: https://docs.github.com/en/rest
|
||||||
|
# Octokit front-end to the GitHub REST API: https://octokit.github.io/rest.js/v18
|
||||||
|
# Octokit endpoint methods: https://github.com/octokit/plugin-rest-endpoint-methods.js/tree/master/docs/repos
|
||||||
|
|
||||||
|
# TODO: Use actions/upload-artifact and actions/download-artifact to simplify deployment.
|
||||||
|
# TODO: Use composite actions to refactor redundant code.
|
||||||
|
|
||||||
|
name: Continuous Deployment
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux:
|
||||||
|
runs-on: ${{matrix.os.genus}}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [{genus: ubuntu-20.04, family: linux}]
|
||||||
|
compiler: [{cc: clang, cxx: clang++}, {cc: gcc, cxx: g++}]
|
||||||
|
cmake_build_type: [Debug, Release]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
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: 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: Build
|
||||||
|
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: Test
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
ctest --output-on-failure &&
|
||||||
|
cd ../Test && ./runtests
|
||||||
|
- name: Zip
|
||||||
|
if: ${{ matrix.compiler.cc == 'clang' }}
|
||||||
|
env:
|
||||||
|
ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
|
||||||
|
run: |
|
||||||
|
cd build/install
|
||||||
|
zip ${ARCHIVE} \
|
||||||
|
bin/glslangValidator \
|
||||||
|
include/glslang/* \
|
||||||
|
lib/libGenericCodeGen${SUFFIX}.a \
|
||||||
|
lib/libglslang${SUFFIX}.a \
|
||||||
|
lib/libglslang-default-resource-limits${SUFFIX}.a \
|
||||||
|
lib/libHLSL${SUFFIX}.a \
|
||||||
|
lib/libMachineIndependent${SUFFIX}.a \
|
||||||
|
lib/libOGLCompiler${SUFFIX}.a \
|
||||||
|
lib/libOSDependent${SUFFIX}.a \
|
||||||
|
lib/libSPIRV${SUFFIX}.a \
|
||||||
|
lib/libSPVRemapper${SUFFIX}.a \
|
||||||
|
lib/libSPIRV-Tools${SUFFIX}.a \
|
||||||
|
lib/libSPIRV-Tools-opt${SUFFIX}.a
|
||||||
|
- name: Deploy
|
||||||
|
if: ${{ matrix.compiler.cc == 'clang' }}
|
||||||
|
env:
|
||||||
|
ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const script = require('.github/workflows/deploy.js')
|
||||||
|
await script({github, context, core})
|
||||||
|
|
||||||
|
macos:
|
||||||
|
runs-on: ${{matrix.os.genus}}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [{genus: macos-10.15, family: osx}]
|
||||||
|
compiler: [{cc: clang, cxx: clang++}]
|
||||||
|
cmake_build_type: [Debug, Release]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
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: |
|
||||||
|
./update_glslang_sources.py
|
||||||
|
- name: Build
|
||||||
|
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: Test
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
ctest --output-on-failure &&
|
||||||
|
cd ../Test && ./runtests
|
||||||
|
- name: Zip
|
||||||
|
env:
|
||||||
|
ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
|
||||||
|
run: |
|
||||||
|
cd build/install
|
||||||
|
zip ${ARCHIVE} \
|
||||||
|
bin/glslangValidator \
|
||||||
|
include/glslang/* \
|
||||||
|
lib/libGenericCodeGen${SUFFIX}.a \
|
||||||
|
lib/libglslang${SUFFIX}.a \
|
||||||
|
lib/libglslang-default-resource-limits${SUFFIX}.a \
|
||||||
|
lib/libHLSL${SUFFIX}.a \
|
||||||
|
lib/libMachineIndependent${SUFFIX}.a \
|
||||||
|
lib/libOGLCompiler${SUFFIX}.a \
|
||||||
|
lib/libOSDependent${SUFFIX}.a \
|
||||||
|
lib/libSPIRV${SUFFIX}.a \
|
||||||
|
lib/libSPVRemapper${SUFFIX}.a \
|
||||||
|
lib/libSPIRV-Tools${SUFFIX}.a \
|
||||||
|
lib/libSPIRV-Tools-opt${SUFFIX}.a
|
||||||
|
- name: Deploy
|
||||||
|
env:
|
||||||
|
ARCHIVE: glslang-master-${{matrix.os.family}}-${{matrix.cmake_build_type}}.zip
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const script = require('.github/workflows/deploy.js')
|
||||||
|
await script({github, context, core})
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
# NOTE: This workflow was ported from Travis.
|
||||||
|
# Travis was using Ubuntu 14.04. Ubuntu 14.04 is not supportted by GitHub workflows. Ubuntu 20.04 is recommended.
|
||||||
|
# Travis was using Clang 3.6. The earliest version support by Ubuntu 20.04 is Clang 6.0.
|
||||||
|
# Travis was caching the clang package. APT package caching is not natively supported by GitHub actions/cache.
|
||||||
|
# Travis was using Mac OS X 10.13.6 / Xcode 9.4.1 / LLVM 9.1.0
|
||||||
|
#
|
||||||
|
name: Continuous Integration
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux:
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
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
|
||||||
|
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: 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: Build
|
||||||
|
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: Test
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
ctest --output-on-failure &&
|
||||||
|
cd ../Test && ./runtests
|
||||||
|
|
||||||
|
macos:
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [macos-10.15]
|
||||||
|
compiler: [{cc: clang, cxx: clang++}]
|
||||||
|
cmake_build_type: [Debug, Release]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
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: |
|
||||||
|
./update_glslang_sources.py
|
||||||
|
- name: Build
|
||||||
|
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: Test
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
ctest --output-on-failure &&
|
||||||
|
cd ../Test && ./runtests
|
||||||
|
|
||||||
|
android:
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-20.04]
|
||||||
|
compiler: [{cc: clang, cxx: clang++}]
|
||||||
|
cmake_build_type: [Release]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
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
|
||||||
|
# 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: 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
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
module.exports = async ({github, context, core}) => {
|
||||||
|
try {
|
||||||
|
await github.rest.git.updateRef({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
ref: 'tags/master-tot',
|
||||||
|
sha: context.sha
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(`upload master-tot tag; ${error.name}; ${error.message}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
let release
|
||||||
|
try {
|
||||||
|
release = await github.rest.repos.getReleaseByTag({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
tag: 'master-tot'
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(`get the master release; ${error.name}; ${error.message}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await github.rest.repos.updateRelease({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
release_id: release.data.id
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(`update the master release; ${error.name}; ${error.message}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
let release_assets
|
||||||
|
try {
|
||||||
|
release_assets = await github.rest.repos.listReleaseAssets({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
release_id: release.data.id
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(`list release assets; ${error.name}; ${error.message}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const { ARCHIVE } = process.env
|
||||||
|
for (const release_asset of release_assets.data) {
|
||||||
|
if (release_asset.name === `${ ARCHIVE }`) {
|
||||||
|
try {
|
||||||
|
await github.rest.repos.deleteReleaseAsset({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
asset_id: release_asset.id
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(`delete ${ ARCHIVE }; ${error.name}; ${error.message}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const asset_path = `./build/install/${ ARCHIVE }`
|
||||||
|
const fs = require("fs")
|
||||||
|
await github.rest.repos.uploadReleaseAsset({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
release_id: release.data.id,
|
||||||
|
name: `${ ARCHIVE }`,
|
||||||
|
data: fs.readFileSync(asset_path)
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(`upload ${ ARCHIVE }; ${error.name}; ${error.message}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,3 +18,7 @@ out/
|
|||||||
third_party/
|
third_party/
|
||||||
buildtools/
|
buildtools/
|
||||||
tools/
|
tools/
|
||||||
|
|
||||||
|
# Random OS stuff
|
||||||
|
.DS_Store
|
||||||
|
._*
|
||||||
|
|||||||
Vendored
-141
@@ -1,141 +0,0 @@
|
|||||||
# Linux and Mac Build Configuration for Travis
|
|
||||||
|
|
||||||
language: cpp
|
|
||||||
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
|
|
||||||
# Use Ubuntu 14.04 LTS (Trusty) as the Linux testing environment.
|
|
||||||
sudo: false
|
|
||||||
dist: trusty
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- secure: aGFrgzyKp+84hKrGkxVWg8cHV61uqrKEHT38gfSQK6+WS4GfLOyH83p7WnsEBb7AMhzU7LMNFdvOFr6+NaMpVnqRvc40CEG1Q+lNg9Pq9mhIZLowvDrfqTL9kQ+8Nbw5Q6/dg6CTvY7fvRfpfCEmKIUZBRkoKUuHeuM1uy3IupFcdNuL5bSYn3Beo+apSJginh9DI4BLDXFUgBzTRSLLyCX5g3cpaeGGOCr8quJlYx75W6HRck5g9SZuLtUoH9GFEV3l+ZEWB8noErW+J56L03bwNwFuuAh321evw++oQk5KFa8rlDvar3SJ3b1RHB8u/eq5DBYMyaK/fS8+Q7QbGr8diF/wDe68bKO7U9IhpNfExXmczCpExjHomW5TQv4rYdGhygPMfW97aIsPRYyNKcl4fkmb7NDrM8w0Jscdq2g5c2Kz0ItyZoBri/NXLwFQQjaVCs7Pf97TjuMA7mK0GJmDTRzi6SrDYlWMt5BQL3y0CCojyfLIRcTh0CQjQI29s97bLfQrYAxt9GNNFR+HTXRLLrkaAlJkPGEPwUywlSfEThnvHLesNxYqemolAYpQT4ithoL4GehGIHmaxsW295aKVhuRf8K9eBODNqrfblvM42UHhjntT+92ZnQ/Gkq80GqaMxnxi4PO5FyPIxt0r981b54YBkWi8YA4P7w5pNI=
|
|
||||||
matrix:
|
|
||||||
- GLSLANG_BUILD_TYPE=Release
|
|
||||||
- GLSLANG_BUILD_TYPE=Debug
|
|
||||||
|
|
||||||
compiler:
|
|
||||||
- clang
|
|
||||||
- gcc
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
fast_finish: true # Show final status immediately if a test fails.
|
|
||||||
exclude:
|
|
||||||
# Skip GCC builds on Mac OS X.
|
|
||||||
- os: osx
|
|
||||||
compiler: gcc
|
|
||||||
include:
|
|
||||||
# Additional build using Android NDK.
|
|
||||||
- env: BUILD_NDK=ON
|
|
||||||
|
|
||||||
cache:
|
|
||||||
apt: true
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- clang-3.6
|
|
||||||
|
|
||||||
install:
|
|
||||||
# Make sure that clang-3.6 is selected on Linux.
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" && "$CC" == "clang" ]]; then
|
|
||||||
export CC=clang-3.6 CXX=clang++-3.6;
|
|
||||||
fi
|
|
||||||
# Download a recent Android NDK and use its android.toolchain.cmake file.
|
|
||||||
- if [[ "$BUILD_NDK" == "ON" ]]; then
|
|
||||||
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;
|
|
||||||
export TOOLCHAIN_PATH=$ANDROID_NDK/build/cmake/android.toolchain.cmake;
|
|
||||||
fi
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
# 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 ../..
|
|
||||||
# get spirv-tools and spirv-headers
|
|
||||||
- ./update_glslang_sources.py
|
|
||||||
|
|
||||||
script:
|
|
||||||
- mkdir build && cd build
|
|
||||||
# For Android, do release building using NDK without testing.
|
|
||||||
# Use android-14, the oldest native API level supporeted by NDK r17b.
|
|
||||||
# We can use newer API levels if we want.
|
|
||||||
# For Linux and macOS, do debug/release building with testing.
|
|
||||||
- if [[ "$BUILD_NDK" == "ON" ]]; then
|
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_PATH}
|
|
||||||
-DANDROID_NATIVE_API_LEVEL=android-14
|
|
||||||
-DCMAKE_BUILD_TYPE=Release
|
|
||||||
-DANDROID_ABI="armeabi-v7a with NEON"
|
|
||||||
-DBUILD_TESTING=OFF ..;
|
|
||||||
make -j4;
|
|
||||||
else
|
|
||||||
cmake -DCMAKE_BUILD_TYPE=${GLSLANG_BUILD_TYPE}
|
|
||||||
-DCMAKE_INSTALL_PREFIX=`pwd`/install ..;
|
|
||||||
make -j4 install;
|
|
||||||
ctest --output-on-failure &&
|
|
||||||
cd ../Test && ./runtests;
|
|
||||||
fi
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
# For debug build, the generated dll has a postfix "d" in its name.
|
|
||||||
- if [[ "${GLSLANG_BUILD_TYPE}" == "Debug" ]]; then
|
|
||||||
export SUFFIX="d";
|
|
||||||
else
|
|
||||||
export SUFFIX="";
|
|
||||||
fi
|
|
||||||
# Create tarball for deployment
|
|
||||||
- if [[ ${CC} == clang* && "${BUILD_NDK}" != "ON" ]]; then
|
|
||||||
cd ../build/install;
|
|
||||||
export TARBALL=glslang-master-${TRAVIS_OS_NAME}-${GLSLANG_BUILD_TYPE}.zip;
|
|
||||||
zip ${TARBALL}
|
|
||||||
bin/glslangValidator
|
|
||||||
include/glslang/*
|
|
||||||
lib/libGenericCodeGen${SUFFIX}.a
|
|
||||||
lib/libglslang${SUFFIX}.a
|
|
||||||
lib/libglslang-default-resource-limits${SUFFIX}.a
|
|
||||||
lib/libHLSL${SUFFIX}.a
|
|
||||||
lib/libMachineIndependent${SUFFIX}.a
|
|
||||||
lib/libOGLCompiler${SUFFIX}.a
|
|
||||||
lib/libOSDependent${SUFFIX}.a
|
|
||||||
lib/libSPIRV${SUFFIX}.a
|
|
||||||
lib/libSPVRemapper${SUFFIX}.a
|
|
||||||
lib/libSPIRV-Tools${SUFFIX}.a
|
|
||||||
lib/libSPIRV-Tools-opt${SUFFIX}.a;
|
|
||||||
fi
|
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
# Tag the current top of the tree as "master-tot".
|
|
||||||
# Travis CI replies on the tag name to properly push to GitHub Releases.
|
|
||||||
- git config --global user.name "Travis CI"
|
|
||||||
- git config --global user.email "builds@travis-ci.org"
|
|
||||||
- git tag -f master-tot
|
|
||||||
- git push -q -f https://${glslangtoken}@github.com/KhronosGroup/glslang --tags
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: releases
|
|
||||||
api_key: ${glslangtoken}
|
|
||||||
on:
|
|
||||||
branch: master
|
|
||||||
condition: ${CC} == clang* && ${BUILD_NDK} != ON
|
|
||||||
file: ${TARBALL}
|
|
||||||
skip_cleanup: true
|
|
||||||
overwrite: true
|
|
||||||
Vendored
+9
@@ -74,6 +74,15 @@ action("glslang_extension_headers") {
|
|||||||
|
|
||||||
out_file = "${target_gen_dir}/include/glslang/glsl_intrinsic_header.h"
|
out_file = "${target_gen_dir}/include/glslang/glsl_intrinsic_header.h"
|
||||||
|
|
||||||
|
# Fuchsia GN build rules require all GN actions to be hermetic and they
|
||||||
|
# should correctly and fully state their inputs and outpus (see
|
||||||
|
# https://fuchsia.dev/fuchsia-src/development/build/hermetic_actions
|
||||||
|
# for details). All input files of the script should be added to the
|
||||||
|
# |sources| list.
|
||||||
|
sources = [
|
||||||
|
"glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl",
|
||||||
|
]
|
||||||
|
|
||||||
inputs = [
|
inputs = [
|
||||||
script
|
script
|
||||||
]
|
]
|
||||||
|
|||||||
Vendored
+20
@@ -3,6 +3,26 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](https://semver.org/).
|
This project adheres to [Semantic Versioning](https://semver.org/).
|
||||||
|
|
||||||
|
## 11.9.0 2022-04-06
|
||||||
|
|
||||||
|
### Other changes
|
||||||
|
* Add GLSL version override functionality
|
||||||
|
* Add eliminate-dead-input-components to -Os
|
||||||
|
* Add enhanced-msgs option
|
||||||
|
* Explicitly use Python 3 for builds
|
||||||
|
|
||||||
|
## 11.8.0 2022-01-27
|
||||||
|
|
||||||
|
### Other changes
|
||||||
|
* Add support for SPIR-V 1.6
|
||||||
|
* Add support for Vulkan 1.3
|
||||||
|
* Add --hlsl-dx-position-w option
|
||||||
|
|
||||||
|
## 11.7.0 2021-11-11
|
||||||
|
|
||||||
|
### Other changes
|
||||||
|
* Add support for targeting Vulkan 1.2 in the C API
|
||||||
|
|
||||||
## 11.6.0 2021-08-25
|
## 11.6.0 2021-08-25
|
||||||
|
|
||||||
### Other changes
|
### Other changes
|
||||||
|
|||||||
Vendored
+10
-3
@@ -106,10 +106,17 @@ CMAKE_DEPENDENT_OPTION(ENABLE_HLSL
|
|||||||
option(ENABLE_RTTI "Enables RTTI" OFF)
|
option(ENABLE_RTTI "Enables RTTI" OFF)
|
||||||
option(ENABLE_EXCEPTIONS "Enables Exceptions" OFF)
|
option(ENABLE_EXCEPTIONS "Enables Exceptions" OFF)
|
||||||
option(ENABLE_OPT "Enables spirv-opt capability if present" ON)
|
option(ENABLE_OPT "Enables spirv-opt capability if present" ON)
|
||||||
option(ENABLE_PCH "Enables Precompiled header" ON)
|
|
||||||
|
if(MINGW OR (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND ${CMAKE_CXX_COMPILER_ID} MATCHES "GNU"))
|
||||||
|
# Workaround for CMake behavior on Mac OS with gcc, cmake generates -Xarch_* arguments
|
||||||
|
# which gcc rejects
|
||||||
|
option(ENABLE_PCH "Enables Precompiled header" OFF)
|
||||||
|
else()
|
||||||
|
option(ENABLE_PCH "Enables Precompiled header" ON)
|
||||||
|
endif()
|
||||||
option(ENABLE_CTEST "Enables testing" ON)
|
option(ENABLE_CTEST "Enables testing" ON)
|
||||||
|
|
||||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND WIN32)
|
if(ENABLE_GLSLANG_INSTALL AND CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND WIN32)
|
||||||
set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "..." FORCE)
|
set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "..." FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -163,7 +170,7 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
|||||||
add_compile_options(-Werror=deprecated-copy)
|
add_compile_options(-Werror=deprecated-copy)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT CMAKE_VERSION VERSION_LESS "3.13")
|
if(NOT CMAKE_VERSION VERSION_LESS "3.13" AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||||
# Error if there's symbols that are not found at link time.
|
# 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
|
# 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.
|
# version don't set this - it should be caught by presubmits anyway.
|
||||||
|
|||||||
Vendored
+656
-24
@@ -303,41 +303,647 @@ APACHE LICENSE, VERSION 2.0
|
|||||||
GPL 3 with special bison exception
|
GPL 3 with special bison exception
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
Bison implementation for Yacc-like parsers in C
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
Preamble
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU General Public License is a free, copyleft license for
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
software and other kinds of works.
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
The licenses for most software and other practical works are designed
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
|
GNU General Public License for most of our software; it applies also to
|
||||||
|
any other work released this way by its authors. You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
As a special exception, you may create a larger work that contains
|
When we speak of free software, we are referring to freedom, not
|
||||||
part or all of the Bison parser skeleton and distribute that work
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
under terms of your choice, so long as that work isn't itself a
|
have the freedom to distribute copies of free software (and charge for
|
||||||
parser generator using the skeleton or a modified version thereof
|
them if you wish), that you receive source code or can get it if you
|
||||||
as a parser skeleton. Alternatively, if you modify or redistribute
|
want it, that you can change the software or use pieces of it in new
|
||||||
the parser skeleton itself, you may (at your option) remove this
|
free programs, and that you know you can do these things.
|
||||||
special exception, which will cause the skeleton and the resulting
|
|
||||||
Bison output files to be licensed under the GNU General Public
|
|
||||||
License without this special exception.
|
|
||||||
|
|
||||||
This special exception was added by the Free Software Foundation in
|
To protect your rights, we need to prevent others from denying you
|
||||||
version 2.2 of Bison.
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
Bison Exception
|
||||||
|
|
||||||
|
As a special exception, you may create a larger work that contains part or all
|
||||||
|
of the Bison parser skeleton and distribute that work under terms of your
|
||||||
|
choice, so long as that work isn't itself a parser generator using the skeleton
|
||||||
|
or a modified version thereof as a parser skeleton. Alternatively, if you
|
||||||
|
modify or redistribute the parser skeleton itself, you may (at your option)
|
||||||
|
remove this special exception, which will cause the skeleton and the resulting
|
||||||
|
Bison output files to be licensed under the GNU General Public License without
|
||||||
|
this special exception.
|
||||||
|
|
||||||
|
This special exception was added by the Free Software Foundation in version
|
||||||
|
2.2 of Bison.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
================================================================================
|
================================================================================
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
The preprocessor has the core licenses stated above, plus an additional licence:
|
The preprocessor has the core licenses stated above, plus additional licences:
|
||||||
|
|
||||||
/****************************************************************************\
|
/****************************************************************************\
|
||||||
Copyright (c) 2002, NVIDIA Corporation.
|
Copyright (c) 2002, NVIDIA Corporation.
|
||||||
@@ -382,3 +988,29 @@ NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
|||||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
\****************************************************************************/
|
\****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
||||||
|
**
|
||||||
|
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
** of this software and/or associated documentation files (the "Materials"),
|
||||||
|
** to deal in the Materials without restriction, including without limitation
|
||||||
|
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
** and/or sell copies of the Materials, and to permit persons to whom the
|
||||||
|
** Materials are furnished to do so, subject to the following conditions:
|
||||||
|
**
|
||||||
|
** The above copyright notice and this permission notice shall be included in
|
||||||
|
** all copies or substantial portions of the Materials.
|
||||||
|
**
|
||||||
|
** 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.
|
||||||
|
*/
|
||||||
|
|||||||
Vendored
+13
-5
@@ -19,8 +19,8 @@ See issue #1964.
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
[](https://travis-ci.org/KhronosGroup/glslang)
|
[](https://ci.appveyor.com/project/Khronoswebmaster/glslang/branch/master)
|
||||||
[](https://ci.appveyor.com/project/Khronoswebmaster/glslang/branch/master)
|

|
||||||
|
|
||||||
# Glslang Components and Status
|
# Glslang Components and Status
|
||||||
|
|
||||||
@@ -85,7 +85,15 @@ The applied stage-specific rules are based on the file extension:
|
|||||||
* `.frag` for a fragment shader
|
* `.frag` for a fragment shader
|
||||||
* `.comp` for a compute shader
|
* `.comp` for a compute shader
|
||||||
|
|
||||||
There is also a non-shader extension
|
For ray tracing pipeline shaders:
|
||||||
|
* `.rgen` for a ray generation shader
|
||||||
|
* `.rint` for a ray intersection shader
|
||||||
|
* `.rahit` for a ray any-hit shader
|
||||||
|
* `.rchit` for a ray closest-hit shader
|
||||||
|
* `.rmiss` for a ray miss shader
|
||||||
|
* `.rcall` for a callable shader
|
||||||
|
|
||||||
|
There is also a non-shader extension:
|
||||||
* `.conf` for a configuration file of limits, see usage statement for example
|
* `.conf` for a configuration file of limits, see usage statement for example
|
||||||
|
|
||||||
## Building (CMake)
|
## Building (CMake)
|
||||||
@@ -161,8 +169,8 @@ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" $SOURCE
|
|||||||
|
|
||||||
For building on Android:
|
For building on Android:
|
||||||
```bash
|
```bash
|
||||||
cmake $SOURCE_DIR -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DANDROID_ABI=arm64-v8a -DCMAKE_BUILD_TYPE=Release -DANDROID_STL=c++_static -DANDROID_PLATFORM=android-24 -DCMAKE_SYSTEM_NAME=Android -DANDROID_TOOLCHAIN=clang -DANDROID_ARM_MODE=arm -DCMAKE_MAKE_PROGRAM=$ANDROID_NDK_ROOT/prebuilt/linux-x86_64/bin/make -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake
|
cmake $SOURCE_DIR -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DANDROID_ABI=arm64-v8a -DCMAKE_BUILD_TYPE=Release -DANDROID_STL=c++_static -DANDROID_PLATFORM=android-24 -DCMAKE_SYSTEM_NAME=Android -DANDROID_TOOLCHAIN=clang -DANDROID_ARM_MODE=arm -DCMAKE_MAKE_PROGRAM=$ANDROID_NDK_HOME/prebuilt/linux-x86_64/bin/make -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake
|
||||||
# If on Windows will be -DCMAKE_MAKE_PROGRAM=%ANDROID_NDK_ROOT%\prebuilt\windows-x86_64\bin\make.exe
|
# If on Windows will be -DCMAKE_MAKE_PROGRAM=%ANDROID_NDK_HOME%\prebuilt\windows-x86_64\bin\make.exe
|
||||||
# -G is needed for building on Windows
|
# -G is needed for building on Windows
|
||||||
# -DANDROID_ABI can also be armeabi-v7a for 32 bit
|
# -DANDROID_ABI can also be armeabi-v7a for 32 bit
|
||||||
```
|
```
|
||||||
|
|||||||
+2
-1
@@ -113,7 +113,8 @@ if(ENABLE_GLSLANG_INSTALL)
|
|||||||
if (ENABLE_SPVREMAPPER)
|
if (ENABLE_SPVREMAPPER)
|
||||||
install(TARGETS SPVRemapper EXPORT SPVRemapperTargets
|
install(TARGETS SPVRemapper EXPORT SPVRemapperTargets
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
endif()
|
endif()
|
||||||
install(TARGETS SPIRV EXPORT SPIRVTargets
|
install(TARGETS SPIRV EXPORT SPIRVTargets
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
|||||||
+89
-26
@@ -1256,8 +1256,10 @@ spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::T
|
|||||||
if (type.getBasicType() == glslang::EbtRayQuery)
|
if (type.getBasicType() == glslang::EbtRayQuery)
|
||||||
return spv::StorageClassPrivate;
|
return spv::StorageClassPrivate;
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
if (type.getQualifier().isSpirvByReference())
|
if (type.getQualifier().isSpirvByReference()) {
|
||||||
return spv::StorageClassFunction;
|
if (type.getQualifier().isParamInput() || type.getQualifier().isParamOutput())
|
||||||
|
return spv::StorageClassFunction;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (type.getQualifier().isPipeInput())
|
if (type.getQualifier().isPipeInput())
|
||||||
return spv::StorageClassInput;
|
return spv::StorageClassInput;
|
||||||
@@ -1662,9 +1664,22 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,
|
|||||||
|
|
||||||
case EShLangCompute:
|
case EShLangCompute:
|
||||||
builder.addCapability(spv::CapabilityShader);
|
builder.addCapability(spv::CapabilityShader);
|
||||||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
|
if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
|
||||||
glslangIntermediate->getLocalSize(1),
|
std::vector<spv::Id> dimConstId;
|
||||||
glslangIntermediate->getLocalSize(2));
|
for (int dim = 0; dim < 3; ++dim) {
|
||||||
|
bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet);
|
||||||
|
dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst));
|
||||||
|
if (specConst) {
|
||||||
|
builder.addDecoration(dimConstId.back(), spv::DecorationSpecId,
|
||||||
|
glslangIntermediate->getLocalSizeSpecId(dim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
builder.addExecutionModeId(shaderEntry, spv::ExecutionModeLocalSizeId, dimConstId);
|
||||||
|
} else {
|
||||||
|
builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
|
||||||
|
glslangIntermediate->getLocalSize(1),
|
||||||
|
glslangIntermediate->getLocalSize(2));
|
||||||
|
}
|
||||||
if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) {
|
if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) {
|
||||||
builder.addCapability(spv::CapabilityComputeDerivativeGroupQuadsNV);
|
builder.addCapability(spv::CapabilityComputeDerivativeGroupQuadsNV);
|
||||||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupQuadsNV);
|
builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupQuadsNV);
|
||||||
@@ -1768,9 +1783,22 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,
|
|||||||
case EShLangMeshNV:
|
case EShLangMeshNV:
|
||||||
builder.addCapability(spv::CapabilityMeshShadingNV);
|
builder.addCapability(spv::CapabilityMeshShadingNV);
|
||||||
builder.addExtension(spv::E_SPV_NV_mesh_shader);
|
builder.addExtension(spv::E_SPV_NV_mesh_shader);
|
||||||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
|
if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
|
||||||
glslangIntermediate->getLocalSize(1),
|
std::vector<spv::Id> dimConstId;
|
||||||
glslangIntermediate->getLocalSize(2));
|
for (int dim = 0; dim < 3; ++dim) {
|
||||||
|
bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet);
|
||||||
|
dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst));
|
||||||
|
if (specConst) {
|
||||||
|
builder.addDecoration(dimConstId.back(), spv::DecorationSpecId,
|
||||||
|
glslangIntermediate->getLocalSizeSpecId(dim));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
builder.addExecutionModeId(shaderEntry, spv::ExecutionModeLocalSizeId, dimConstId);
|
||||||
|
} else {
|
||||||
|
builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
|
||||||
|
glslangIntermediate->getLocalSize(1),
|
||||||
|
glslangIntermediate->getLocalSize(2));
|
||||||
|
}
|
||||||
if (glslangIntermediate->getStage() == EShLangMeshNV) {
|
if (glslangIntermediate->getStage() == EShLangMeshNV) {
|
||||||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices,
|
builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices,
|
||||||
glslangIntermediate->getVertices());
|
glslangIntermediate->getVertices());
|
||||||
@@ -3777,7 +3805,16 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T
|
|||||||
|
|
||||||
switch (node->getFlowOp()) {
|
switch (node->getFlowOp()) {
|
||||||
case glslang::EOpKill:
|
case glslang::EOpKill:
|
||||||
builder.makeStatementTerminator(spv::OpKill, "post-discard");
|
if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
|
||||||
|
if (glslangIntermediate->getSource() == glslang::EShSourceHlsl) {
|
||||||
|
builder.addCapability(spv::CapabilityDemoteToHelperInvocation);
|
||||||
|
builder.createNoResultOp(spv::OpDemoteToHelperInvocationEXT);
|
||||||
|
} else {
|
||||||
|
builder.makeStatementTerminator(spv::OpTerminateInvocation, "post-terminate-invocation");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
builder.makeStatementTerminator(spv::OpKill, "post-discard");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case glslang::EOpTerminateInvocation:
|
case glslang::EOpTerminateInvocation:
|
||||||
builder.addExtension(spv::E_SPV_KHR_terminate_invocation);
|
builder.addExtension(spv::E_SPV_KHR_terminate_invocation);
|
||||||
@@ -4148,23 +4185,23 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty
|
|||||||
const auto& spirvType = type.getSpirvType();
|
const auto& spirvType = type.getSpirvType();
|
||||||
const auto& spirvInst = spirvType.spirvInst;
|
const auto& spirvInst = spirvType.spirvInst;
|
||||||
|
|
||||||
std::vector<spv::Id> operands;
|
std::vector<spv::IdImmediate> operands;
|
||||||
for (const auto& typeParam : spirvType.typeParams) {
|
for (const auto& typeParam : spirvType.typeParams) {
|
||||||
// Constant expression
|
// Constant expression
|
||||||
if (typeParam.constant->isLiteral()) {
|
if (typeParam.constant->isLiteral()) {
|
||||||
if (typeParam.constant->getBasicType() == glslang::EbtFloat) {
|
if (typeParam.constant->getBasicType() == glslang::EbtFloat) {
|
||||||
float floatValue = static_cast<float>(typeParam.constant->getConstArray()[0].getDConst());
|
float floatValue = static_cast<float>(typeParam.constant->getConstArray()[0].getDConst());
|
||||||
unsigned literal = *reinterpret_cast<unsigned*>(&floatValue);
|
unsigned literal = *reinterpret_cast<unsigned*>(&floatValue);
|
||||||
operands.push_back(literal);
|
operands.push_back({false, literal});
|
||||||
} else if (typeParam.constant->getBasicType() == glslang::EbtInt) {
|
} else if (typeParam.constant->getBasicType() == glslang::EbtInt) {
|
||||||
unsigned literal = typeParam.constant->getConstArray()[0].getIConst();
|
unsigned literal = typeParam.constant->getConstArray()[0].getIConst();
|
||||||
operands.push_back(literal);
|
operands.push_back({false, literal});
|
||||||
} else if (typeParam.constant->getBasicType() == glslang::EbtUint) {
|
} else if (typeParam.constant->getBasicType() == glslang::EbtUint) {
|
||||||
unsigned literal = typeParam.constant->getConstArray()[0].getUConst();
|
unsigned literal = typeParam.constant->getConstArray()[0].getUConst();
|
||||||
operands.push_back(literal);
|
operands.push_back({false, literal});
|
||||||
} else if (typeParam.constant->getBasicType() == glslang::EbtBool) {
|
} else if (typeParam.constant->getBasicType() == glslang::EbtBool) {
|
||||||
unsigned literal = typeParam.constant->getConstArray()[0].getBConst();
|
unsigned literal = typeParam.constant->getConstArray()[0].getBConst();
|
||||||
operands.push_back(literal);
|
operands.push_back({false, literal});
|
||||||
} else if (typeParam.constant->getBasicType() == glslang::EbtString) {
|
} else if (typeParam.constant->getBasicType() == glslang::EbtString) {
|
||||||
auto str = typeParam.constant->getConstArray()[0].getSConst()->c_str();
|
auto str = typeParam.constant->getConstArray()[0].getSConst()->c_str();
|
||||||
unsigned literal = 0;
|
unsigned literal = 0;
|
||||||
@@ -4176,7 +4213,7 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty
|
|||||||
*(literalPtr++) = ch;
|
*(literalPtr++) = ch;
|
||||||
++charCount;
|
++charCount;
|
||||||
if (charCount == 4) {
|
if (charCount == 4) {
|
||||||
operands.push_back(literal);
|
operands.push_back({false, literal});
|
||||||
literalPtr = reinterpret_cast<char*>(&literal);
|
literalPtr = reinterpret_cast<char*>(&literal);
|
||||||
charCount = 0;
|
charCount = 0;
|
||||||
}
|
}
|
||||||
@@ -4186,20 +4223,17 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty
|
|||||||
if (charCount > 0) {
|
if (charCount > 0) {
|
||||||
for (; charCount < 4; ++charCount)
|
for (; charCount < 4; ++charCount)
|
||||||
*(literalPtr++) = 0;
|
*(literalPtr++) = 0;
|
||||||
operands.push_back(literal);
|
operands.push_back({false, literal});
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
assert(0); // Unexpected type
|
assert(0); // Unexpected type
|
||||||
} else
|
} else
|
||||||
operands.push_back(createSpvConstant(*typeParam.constant));
|
operands.push_back({true, createSpvConstant(*typeParam.constant)});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spirvInst.set == "")
|
assert(spirvInst.set == ""); // Currently, couldn't be extended instructions.
|
||||||
spvType = builder.createOp(static_cast<spv::Op>(spirvInst.id), spv::NoType, operands);
|
spvType = builder.makeGenericType(static_cast<spv::Op>(spirvInst.id), operands);
|
||||||
else {
|
|
||||||
spvType = builder.createBuiltinCall(
|
|
||||||
spv::NoType, getExtBuiltins(spirvInst.set.c_str()), spirvInst.id, operands);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -8717,8 +8751,18 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
|
|||||||
builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutOffset);
|
builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symbol->getQualifier().hasLocation())
|
if (symbol->getQualifier().hasLocation()) {
|
||||||
builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation);
|
if (!(glslangIntermediate->isRayTracingStage() && glslangIntermediate->IsRequestedExtension(glslang::E_GL_EXT_ray_tracing)
|
||||||
|
&& (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.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));
|
builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));
|
||||||
if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {
|
if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {
|
||||||
builder.addCapability(spv::CapabilityGeometryStreams);
|
builder.addCapability(spv::CapabilityGeometryStreams);
|
||||||
@@ -8752,7 +8796,16 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
|
|||||||
|
|
||||||
// add built-in variable decoration
|
// add built-in variable decoration
|
||||||
if (builtIn != spv::BuiltInMax) {
|
if (builtIn != spv::BuiltInMax) {
|
||||||
builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
|
// WorkgroupSize deprecated in spirv1.6
|
||||||
|
if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_6 ||
|
||||||
|
builtIn != spv::BuiltInWorkgroupSize)
|
||||||
|
builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add volatile decoration to HelperInvocation for spirv1.6 and beyond
|
||||||
|
if (builtIn == spv::BuiltInHelperInvocation &&
|
||||||
|
glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_6) {
|
||||||
|
builder.addDecoration(id, spv::DecorationVolatile);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
@@ -9025,15 +9078,19 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla
|
|||||||
break;
|
break;
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
case glslang::EbtInt8:
|
case glslang::EbtInt8:
|
||||||
|
builder.addCapability(spv::CapabilityInt8);
|
||||||
spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const()));
|
spvConsts.push_back(builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const()));
|
||||||
break;
|
break;
|
||||||
case glslang::EbtUint8:
|
case glslang::EbtUint8:
|
||||||
|
builder.addCapability(spv::CapabilityInt8);
|
||||||
spvConsts.push_back(builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const()));
|
spvConsts.push_back(builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const()));
|
||||||
break;
|
break;
|
||||||
case glslang::EbtInt16:
|
case glslang::EbtInt16:
|
||||||
|
builder.addCapability(spv::CapabilityInt16);
|
||||||
spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const()));
|
spvConsts.push_back(builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const()));
|
||||||
break;
|
break;
|
||||||
case glslang::EbtUint16:
|
case glslang::EbtUint16:
|
||||||
|
builder.addCapability(spv::CapabilityInt16);
|
||||||
spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const()));
|
spvConsts.push_back(builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const()));
|
||||||
break;
|
break;
|
||||||
case glslang::EbtInt64:
|
case glslang::EbtInt64:
|
||||||
@@ -9046,6 +9103,7 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla
|
|||||||
spvConsts.push_back(builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst()));
|
spvConsts.push_back(builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst()));
|
||||||
break;
|
break;
|
||||||
case glslang::EbtFloat16:
|
case glslang::EbtFloat16:
|
||||||
|
builder.addCapability(spv::CapabilityFloat16);
|
||||||
spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));
|
spvConsts.push_back(builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst()));
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@@ -9074,15 +9132,19 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla
|
|||||||
break;
|
break;
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
case glslang::EbtInt8:
|
case glslang::EbtInt8:
|
||||||
|
builder.addCapability(spv::CapabilityInt8);
|
||||||
scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant);
|
scalar = builder.makeInt8Constant(zero ? 0 : consts[nextConst].getI8Const(), specConstant);
|
||||||
break;
|
break;
|
||||||
case glslang::EbtUint8:
|
case glslang::EbtUint8:
|
||||||
|
builder.addCapability(spv::CapabilityInt8);
|
||||||
scalar = builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const(), specConstant);
|
scalar = builder.makeUint8Constant(zero ? 0 : consts[nextConst].getU8Const(), specConstant);
|
||||||
break;
|
break;
|
||||||
case glslang::EbtInt16:
|
case glslang::EbtInt16:
|
||||||
|
builder.addCapability(spv::CapabilityInt16);
|
||||||
scalar = builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const(), specConstant);
|
scalar = builder.makeInt16Constant(zero ? 0 : consts[nextConst].getI16Const(), specConstant);
|
||||||
break;
|
break;
|
||||||
case glslang::EbtUint16:
|
case glslang::EbtUint16:
|
||||||
|
builder.addCapability(spv::CapabilityInt16);
|
||||||
scalar = builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const(), specConstant);
|
scalar = builder.makeUint16Constant(zero ? 0 : consts[nextConst].getU16Const(), specConstant);
|
||||||
break;
|
break;
|
||||||
case glslang::EbtInt64:
|
case glslang::EbtInt64:
|
||||||
@@ -9095,6 +9157,7 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla
|
|||||||
scalar = builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst(), specConstant);
|
scalar = builder.makeDoubleConstant(zero ? 0.0 : consts[nextConst].getDConst(), specConstant);
|
||||||
break;
|
break;
|
||||||
case glslang::EbtFloat16:
|
case glslang::EbtFloat16:
|
||||||
|
builder.addCapability(spv::CapabilityFloat16);
|
||||||
scalar = builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);
|
scalar = builder.makeFloat16Constant(zero ? 0.0F : (float)consts[nextConst].getDConst(), specConstant);
|
||||||
break;
|
break;
|
||||||
case glslang::EbtReference:
|
case glslang::EbtReference:
|
||||||
|
|||||||
+12
-6
@@ -297,15 +297,21 @@ namespace spv {
|
|||||||
std::string spirvbin_t::literalString(unsigned word) const
|
std::string spirvbin_t::literalString(unsigned word) const
|
||||||
{
|
{
|
||||||
std::string literal;
|
std::string literal;
|
||||||
|
const spirword_t * pos = spv.data() + word;
|
||||||
|
|
||||||
literal.reserve(16);
|
literal.reserve(16);
|
||||||
|
|
||||||
const char* bytes = reinterpret_cast<const char*>(spv.data() + word);
|
do {
|
||||||
|
spirword_t word = *pos;
|
||||||
while (bytes && *bytes)
|
for (int i = 0; i < 4; i++) {
|
||||||
literal += *bytes++;
|
char c = word & 0xff;
|
||||||
|
if (c == '\0')
|
||||||
return literal;
|
return literal;
|
||||||
|
literal += c;
|
||||||
|
word >>= 8;
|
||||||
|
}
|
||||||
|
pos++;
|
||||||
|
} while (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void spirvbin_t::applyMap()
|
void spirvbin_t::applyMap()
|
||||||
|
|||||||
+31
@@ -427,6 +427,37 @@ Id Builder::makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols)
|
|||||||
return type->getResultId();
|
return type->getResultId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Id Builder::makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& operands)
|
||||||
|
{
|
||||||
|
// try to find it
|
||||||
|
Instruction* type;
|
||||||
|
for (int t = 0; t < (int)groupedTypes[opcode].size(); ++t) {
|
||||||
|
type = groupedTypes[opcode][t];
|
||||||
|
if (static_cast<size_t>(type->getNumOperands()) != operands.size())
|
||||||
|
continue; // Number mismatch, find next
|
||||||
|
|
||||||
|
bool match = true;
|
||||||
|
for (int op = 0; match && op < (int)operands.size(); ++op) {
|
||||||
|
match = (operands[op].isId ? type->getIdOperand(op) : type->getImmediateOperand(op)) == operands[op].word;
|
||||||
|
}
|
||||||
|
if (match)
|
||||||
|
return type->getResultId();
|
||||||
|
}
|
||||||
|
|
||||||
|
// not found, make it
|
||||||
|
type = new Instruction(getUniqueId(), NoType, opcode);
|
||||||
|
for (size_t op = 0; op < operands.size(); ++op) {
|
||||||
|
if (operands[op].isId)
|
||||||
|
type->addIdOperand(operands[op].word);
|
||||||
|
else
|
||||||
|
type->addImmediateOperand(operands[op].word);
|
||||||
|
}
|
||||||
|
groupedTypes[opcode].push_back(type);
|
||||||
|
constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
|
||||||
|
module.mapInstruction(type);
|
||||||
|
|
||||||
|
return type->getResultId();
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: performance: track arrays per stride
|
// TODO: performance: track arrays per stride
|
||||||
// If a stride is supplied (non-zero) make an array.
|
// If a stride is supplied (non-zero) make an array.
|
||||||
|
|||||||
+1
@@ -181,6 +181,7 @@ public:
|
|||||||
Id makeSamplerType();
|
Id makeSamplerType();
|
||||||
Id makeSampledImageType(Id imageType);
|
Id makeSampledImageType(Id imageType);
|
||||||
Id makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols);
|
Id makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols);
|
||||||
|
Id makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& operands);
|
||||||
|
|
||||||
// accelerationStructureNV type
|
// accelerationStructureNV type
|
||||||
Id makeAccelerationStructureType();
|
Id makeAccelerationStructureType();
|
||||||
|
|||||||
+3
@@ -68,6 +68,8 @@ spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLog
|
|||||||
}
|
}
|
||||||
case glslang::EShTargetVulkan_1_2:
|
case glslang::EShTargetVulkan_1_2:
|
||||||
return spv_target_env::SPV_ENV_VULKAN_1_2;
|
return spv_target_env::SPV_ENV_VULKAN_1_2;
|
||||||
|
case glslang::EShTargetVulkan_1_3:
|
||||||
|
return spv_target_env::SPV_ENV_VULKAN_1_3;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -210,6 +212,7 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector
|
|||||||
optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass());
|
optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass());
|
||||||
if (options->optimizeSize) {
|
if (options->optimizeSize) {
|
||||||
optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
|
optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
|
||||||
|
optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsPass());
|
||||||
}
|
}
|
||||||
optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
|
optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
|
||||||
optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
|
optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
|
||||||
|
|||||||
+31
-16
@@ -43,6 +43,7 @@
|
|||||||
#include <stack>
|
#include <stack>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "disassemble.h"
|
#include "disassemble.h"
|
||||||
#include "doc.h"
|
#include "doc.h"
|
||||||
@@ -100,6 +101,7 @@ protected:
|
|||||||
void outputMask(OperandClass operandClass, unsigned mask);
|
void outputMask(OperandClass operandClass, unsigned mask);
|
||||||
void disassembleImmediates(int numOperands);
|
void disassembleImmediates(int numOperands);
|
||||||
void disassembleIds(int numOperands);
|
void disassembleIds(int numOperands);
|
||||||
|
std::pair<int, std::string> decodeString();
|
||||||
int disassembleString();
|
int disassembleString();
|
||||||
void disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands);
|
void disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands);
|
||||||
|
|
||||||
@@ -290,31 +292,44 @@ void SpirvStream::disassembleIds(int numOperands)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// return the number of operands consumed by the string
|
// decode string from words at current position (non-consuming)
|
||||||
int SpirvStream::disassembleString()
|
std::pair<int, std::string> SpirvStream::decodeString()
|
||||||
{
|
{
|
||||||
int startWord = word;
|
std::string res;
|
||||||
|
int wordPos = word;
|
||||||
out << " \"";
|
char c;
|
||||||
|
|
||||||
const char* wordString;
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
unsigned int content = stream[word];
|
unsigned int content = stream[wordPos];
|
||||||
wordString = (const char*)&content;
|
|
||||||
for (int charCount = 0; charCount < 4; ++charCount) {
|
for (int charCount = 0; charCount < 4; ++charCount) {
|
||||||
if (*wordString == 0) {
|
c = content & 0xff;
|
||||||
|
content >>= 8;
|
||||||
|
if (c == '\0') {
|
||||||
done = true;
|
done = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out << *(wordString++);
|
res += c;
|
||||||
}
|
}
|
||||||
++word;
|
++wordPos;
|
||||||
} while (! done);
|
} while(! done);
|
||||||
|
|
||||||
|
return std::make_pair(wordPos - word, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the number of operands consumed by the string
|
||||||
|
int SpirvStream::disassembleString()
|
||||||
|
{
|
||||||
|
out << " \"";
|
||||||
|
|
||||||
|
std::pair<int, std::string> decoderes = decodeString();
|
||||||
|
|
||||||
|
out << decoderes.second;
|
||||||
out << "\"";
|
out << "\"";
|
||||||
|
|
||||||
return word - startWord;
|
word += decoderes.first;
|
||||||
|
|
||||||
|
return decoderes.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, int numOperands)
|
void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, int numOperands)
|
||||||
@@ -331,7 +346,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode,
|
|||||||
nextNestedControl = 0;
|
nextNestedControl = 0;
|
||||||
}
|
}
|
||||||
} else if (opCode == OpExtInstImport) {
|
} else if (opCode == OpExtInstImport) {
|
||||||
idDescriptor[resultId] = (const char*)(&stream[word]);
|
idDescriptor[resultId] = decodeString().second;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (resultId != 0 && idDescriptor[resultId].size() == 0) {
|
if (resultId != 0 && idDescriptor[resultId].size() == 0) {
|
||||||
@@ -428,7 +443,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode,
|
|||||||
--numOperands;
|
--numOperands;
|
||||||
// Get names for printing "(XXX)" for readability, *after* this id
|
// Get names for printing "(XXX)" for readability, *after* this id
|
||||||
if (opCode == OpName)
|
if (opCode == OpName)
|
||||||
idDescriptor[stream[word - 1]] = (const char*)(&stream[word]);
|
idDescriptor[stream[word - 1]] = decodeString().second;
|
||||||
break;
|
break;
|
||||||
case OperandVariableIds:
|
case OperandVariableIds:
|
||||||
disassembleIds(numOperands);
|
disassembleIds(numOperands);
|
||||||
|
|||||||
Vendored
+6
@@ -900,6 +900,12 @@ const char* CapabilityString(int info)
|
|||||||
case CapabilityDeviceGroup: return "DeviceGroup";
|
case CapabilityDeviceGroup: return "DeviceGroup";
|
||||||
case CapabilityMultiView: return "MultiView";
|
case CapabilityMultiView: return "MultiView";
|
||||||
|
|
||||||
|
case CapabilityDenormPreserve: return "DenormPreserve";
|
||||||
|
case CapabilityDenormFlushToZero: return "DenormFlushToZero";
|
||||||
|
case CapabilitySignedZeroInfNanPreserve: return "SignedZeroInfNanPreserve";
|
||||||
|
case CapabilityRoundingModeRTE: return "RoundingModeRTE";
|
||||||
|
case CapabilityRoundingModeRTZ: return "RoundingModeRTZ";
|
||||||
|
|
||||||
case CapabilityStencilExportEXT: return "StencilExportEXT";
|
case CapabilityStencilExportEXT: return "StencilExportEXT";
|
||||||
|
|
||||||
case CapabilityFloat16ImageAMD: return "Float16ImageAMD";
|
case CapabilityFloat16ImageAMD: return "Float16ImageAMD";
|
||||||
|
|||||||
Vendored
+202
-7
@@ -49,12 +49,12 @@ namespace spv {
|
|||||||
|
|
||||||
typedef unsigned int Id;
|
typedef unsigned int Id;
|
||||||
|
|
||||||
#define SPV_VERSION 0x10500
|
#define SPV_VERSION 0x10600
|
||||||
#define SPV_REVISION 4
|
#define SPV_REVISION 1
|
||||||
|
|
||||||
static const unsigned int MagicNumber = 0x07230203;
|
static const unsigned int MagicNumber = 0x07230203;
|
||||||
static const unsigned int Version = 0x00010500;
|
static const unsigned int Version = 0x00010600;
|
||||||
static const unsigned int Revision = 4;
|
static const unsigned int Revision = 1;
|
||||||
static const unsigned int OpCodeMask = 0xffff;
|
static const unsigned int OpCodeMask = 0xffff;
|
||||||
static const unsigned int WordCountShift = 16;
|
static const unsigned int WordCountShift = 16;
|
||||||
|
|
||||||
@@ -65,6 +65,7 @@ enum SourceLanguage {
|
|||||||
SourceLanguageOpenCL_C = 3,
|
SourceLanguageOpenCL_C = 3,
|
||||||
SourceLanguageOpenCL_CPP = 4,
|
SourceLanguageOpenCL_CPP = 4,
|
||||||
SourceLanguageHLSL = 5,
|
SourceLanguageHLSL = 5,
|
||||||
|
SourceLanguageCPP_for_OpenCL = 6,
|
||||||
SourceLanguageMax = 0x7fffffff,
|
SourceLanguageMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -352,6 +353,8 @@ enum ImageOperandsShift {
|
|||||||
ImageOperandsVolatileTexelKHRShift = 11,
|
ImageOperandsVolatileTexelKHRShift = 11,
|
||||||
ImageOperandsSignExtendShift = 12,
|
ImageOperandsSignExtendShift = 12,
|
||||||
ImageOperandsZeroExtendShift = 13,
|
ImageOperandsZeroExtendShift = 13,
|
||||||
|
ImageOperandsNontemporalShift = 14,
|
||||||
|
ImageOperandsOffsetsShift = 16,
|
||||||
ImageOperandsMax = 0x7fffffff,
|
ImageOperandsMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -375,6 +378,8 @@ enum ImageOperandsMask {
|
|||||||
ImageOperandsVolatileTexelKHRMask = 0x00000800,
|
ImageOperandsVolatileTexelKHRMask = 0x00000800,
|
||||||
ImageOperandsSignExtendMask = 0x00001000,
|
ImageOperandsSignExtendMask = 0x00001000,
|
||||||
ImageOperandsZeroExtendMask = 0x00002000,
|
ImageOperandsZeroExtendMask = 0x00002000,
|
||||||
|
ImageOperandsNontemporalMask = 0x00004000,
|
||||||
|
ImageOperandsOffsetsMask = 0x00010000,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FPFastMathModeShift {
|
enum FPFastMathModeShift {
|
||||||
@@ -491,6 +496,7 @@ enum Decoration {
|
|||||||
DecorationPerPrimitiveNV = 5271,
|
DecorationPerPrimitiveNV = 5271,
|
||||||
DecorationPerViewNV = 5272,
|
DecorationPerViewNV = 5272,
|
||||||
DecorationPerTaskNV = 5273,
|
DecorationPerTaskNV = 5273,
|
||||||
|
DecorationPerVertexKHR = 5285,
|
||||||
DecorationPerVertexNV = 5285,
|
DecorationPerVertexNV = 5285,
|
||||||
DecorationNonUniform = 5300,
|
DecorationNonUniform = 5300,
|
||||||
DecorationNonUniformEXT = 5300,
|
DecorationNonUniformEXT = 5300,
|
||||||
@@ -498,6 +504,10 @@ enum Decoration {
|
|||||||
DecorationRestrictPointerEXT = 5355,
|
DecorationRestrictPointerEXT = 5355,
|
||||||
DecorationAliasedPointer = 5356,
|
DecorationAliasedPointer = 5356,
|
||||||
DecorationAliasedPointerEXT = 5356,
|
DecorationAliasedPointerEXT = 5356,
|
||||||
|
DecorationBindlessSamplerNV = 5398,
|
||||||
|
DecorationBindlessImageNV = 5399,
|
||||||
|
DecorationBoundSamplerNV = 5400,
|
||||||
|
DecorationBoundImageNV = 5401,
|
||||||
DecorationSIMTCallINTEL = 5599,
|
DecorationSIMTCallINTEL = 5599,
|
||||||
DecorationReferencedIndirectlyINTEL = 5602,
|
DecorationReferencedIndirectlyINTEL = 5602,
|
||||||
DecorationClobberINTEL = 5607,
|
DecorationClobberINTEL = 5607,
|
||||||
@@ -537,6 +547,7 @@ enum Decoration {
|
|||||||
DecorationFunctionFloatingPointModeINTEL = 6080,
|
DecorationFunctionFloatingPointModeINTEL = 6080,
|
||||||
DecorationSingleElementVectorINTEL = 6085,
|
DecorationSingleElementVectorINTEL = 6085,
|
||||||
DecorationVectorComputeCallableFunctionINTEL = 6087,
|
DecorationVectorComputeCallableFunctionINTEL = 6087,
|
||||||
|
DecorationMediaBlockIOINTEL = 6140,
|
||||||
DecorationMax = 0x7fffffff,
|
DecorationMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -621,7 +632,9 @@ enum BuiltIn {
|
|||||||
BuiltInLayerPerViewNV = 5279,
|
BuiltInLayerPerViewNV = 5279,
|
||||||
BuiltInMeshViewCountNV = 5280,
|
BuiltInMeshViewCountNV = 5280,
|
||||||
BuiltInMeshViewIndicesNV = 5281,
|
BuiltInMeshViewIndicesNV = 5281,
|
||||||
|
BuiltInBaryCoordKHR = 5286,
|
||||||
BuiltInBaryCoordNV = 5286,
|
BuiltInBaryCoordNV = 5286,
|
||||||
|
BuiltInBaryCoordNoPerspKHR = 5287,
|
||||||
BuiltInBaryCoordNoPerspNV = 5287,
|
BuiltInBaryCoordNoPerspNV = 5287,
|
||||||
BuiltInFragSizeEXT = 5292,
|
BuiltInFragSizeEXT = 5292,
|
||||||
BuiltInFragmentSizeNV = 5292,
|
BuiltInFragmentSizeNV = 5292,
|
||||||
@@ -722,6 +735,7 @@ enum FunctionControlShift {
|
|||||||
FunctionControlDontInlineShift = 1,
|
FunctionControlDontInlineShift = 1,
|
||||||
FunctionControlPureShift = 2,
|
FunctionControlPureShift = 2,
|
||||||
FunctionControlConstShift = 3,
|
FunctionControlConstShift = 3,
|
||||||
|
FunctionControlOptNoneINTELShift = 16,
|
||||||
FunctionControlMax = 0x7fffffff,
|
FunctionControlMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -731,6 +745,7 @@ enum FunctionControlMask {
|
|||||||
FunctionControlDontInlineMask = 0x00000002,
|
FunctionControlDontInlineMask = 0x00000002,
|
||||||
FunctionControlPureMask = 0x00000004,
|
FunctionControlPureMask = 0x00000004,
|
||||||
FunctionControlConstMask = 0x00000008,
|
FunctionControlConstMask = 0x00000008,
|
||||||
|
FunctionControlOptNoneINTELMask = 0x00010000,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MemorySemanticsShift {
|
enum MemorySemanticsShift {
|
||||||
@@ -911,6 +926,7 @@ enum Capability {
|
|||||||
CapabilityGroupNonUniformQuad = 68,
|
CapabilityGroupNonUniformQuad = 68,
|
||||||
CapabilityShaderLayer = 69,
|
CapabilityShaderLayer = 69,
|
||||||
CapabilityShaderViewportIndex = 70,
|
CapabilityShaderViewportIndex = 70,
|
||||||
|
CapabilityUniformDecoration = 71,
|
||||||
CapabilityFragmentShadingRateKHR = 4422,
|
CapabilityFragmentShadingRateKHR = 4422,
|
||||||
CapabilitySubgroupBallotKHR = 4423,
|
CapabilitySubgroupBallotKHR = 4423,
|
||||||
CapabilityDrawParameters = 4427,
|
CapabilityDrawParameters = 4427,
|
||||||
@@ -959,6 +975,7 @@ enum Capability {
|
|||||||
CapabilityFragmentFullyCoveredEXT = 5265,
|
CapabilityFragmentFullyCoveredEXT = 5265,
|
||||||
CapabilityMeshShadingNV = 5266,
|
CapabilityMeshShadingNV = 5266,
|
||||||
CapabilityImageFootprintNV = 5282,
|
CapabilityImageFootprintNV = 5282,
|
||||||
|
CapabilityFragmentBarycentricKHR = 5284,
|
||||||
CapabilityFragmentBarycentricNV = 5284,
|
CapabilityFragmentBarycentricNV = 5284,
|
||||||
CapabilityComputeDerivativeGroupQuadsNV = 5288,
|
CapabilityComputeDerivativeGroupQuadsNV = 5288,
|
||||||
CapabilityFragmentDensityEXT = 5291,
|
CapabilityFragmentDensityEXT = 5291,
|
||||||
@@ -1003,7 +1020,9 @@ enum Capability {
|
|||||||
CapabilityFragmentShaderShadingRateInterlockEXT = 5372,
|
CapabilityFragmentShaderShadingRateInterlockEXT = 5372,
|
||||||
CapabilityShaderSMBuiltinsNV = 5373,
|
CapabilityShaderSMBuiltinsNV = 5373,
|
||||||
CapabilityFragmentShaderPixelInterlockEXT = 5378,
|
CapabilityFragmentShaderPixelInterlockEXT = 5378,
|
||||||
|
CapabilityDemoteToHelperInvocation = 5379,
|
||||||
CapabilityDemoteToHelperInvocationEXT = 5379,
|
CapabilityDemoteToHelperInvocationEXT = 5379,
|
||||||
|
CapabilityBindlessTextureNV = 5390,
|
||||||
CapabilitySubgroupShuffleINTEL = 5568,
|
CapabilitySubgroupShuffleINTEL = 5568,
|
||||||
CapabilitySubgroupBufferBlockIOINTEL = 5569,
|
CapabilitySubgroupBufferBlockIOINTEL = 5569,
|
||||||
CapabilitySubgroupImageBlockIOINTEL = 5570,
|
CapabilitySubgroupImageBlockIOINTEL = 5570,
|
||||||
@@ -1028,6 +1047,7 @@ enum Capability {
|
|||||||
CapabilityFPGAMemoryAttributesINTEL = 5824,
|
CapabilityFPGAMemoryAttributesINTEL = 5824,
|
||||||
CapabilityFPFastMathModeINTEL = 5837,
|
CapabilityFPFastMathModeINTEL = 5837,
|
||||||
CapabilityArbitraryPrecisionIntegersINTEL = 5844,
|
CapabilityArbitraryPrecisionIntegersINTEL = 5844,
|
||||||
|
CapabilityArbitraryPrecisionFloatingPointINTEL = 5845,
|
||||||
CapabilityUnstructuredLoopControlsINTEL = 5886,
|
CapabilityUnstructuredLoopControlsINTEL = 5886,
|
||||||
CapabilityFPGALoopControlsINTEL = 5888,
|
CapabilityFPGALoopControlsINTEL = 5888,
|
||||||
CapabilityKernelAttributesINTEL = 5892,
|
CapabilityKernelAttributesINTEL = 5892,
|
||||||
@@ -1036,14 +1056,26 @@ enum Capability {
|
|||||||
CapabilityFPGAClusterAttributesINTEL = 5904,
|
CapabilityFPGAClusterAttributesINTEL = 5904,
|
||||||
CapabilityLoopFuseINTEL = 5906,
|
CapabilityLoopFuseINTEL = 5906,
|
||||||
CapabilityFPGABufferLocationINTEL = 5920,
|
CapabilityFPGABufferLocationINTEL = 5920,
|
||||||
|
CapabilityArbitraryPrecisionFixedPointINTEL = 5922,
|
||||||
CapabilityUSMStorageClassesINTEL = 5935,
|
CapabilityUSMStorageClassesINTEL = 5935,
|
||||||
CapabilityIOPipesINTEL = 5943,
|
CapabilityIOPipesINTEL = 5943,
|
||||||
CapabilityBlockingPipesINTEL = 5945,
|
CapabilityBlockingPipesINTEL = 5945,
|
||||||
CapabilityFPGARegINTEL = 5948,
|
CapabilityFPGARegINTEL = 5948,
|
||||||
|
CapabilityDotProductInputAll = 6016,
|
||||||
|
CapabilityDotProductInputAllKHR = 6016,
|
||||||
|
CapabilityDotProductInput4x8Bit = 6017,
|
||||||
|
CapabilityDotProductInput4x8BitKHR = 6017,
|
||||||
|
CapabilityDotProductInput4x8BitPacked = 6018,
|
||||||
|
CapabilityDotProductInput4x8BitPackedKHR = 6018,
|
||||||
|
CapabilityDotProduct = 6019,
|
||||||
|
CapabilityDotProductKHR = 6019,
|
||||||
|
CapabilityBitInstructions = 6025,
|
||||||
CapabilityAtomicFloat32AddEXT = 6033,
|
CapabilityAtomicFloat32AddEXT = 6033,
|
||||||
CapabilityAtomicFloat64AddEXT = 6034,
|
CapabilityAtomicFloat64AddEXT = 6034,
|
||||||
CapabilityLongConstantCompositeINTEL = 6089,
|
CapabilityLongConstantCompositeINTEL = 6089,
|
||||||
|
CapabilityOptNoneINTEL = 6094,
|
||||||
CapabilityAtomicFloat16AddEXT = 6095,
|
CapabilityAtomicFloat16AddEXT = 6095,
|
||||||
|
CapabilityDebugInfoModuleINTEL = 6114,
|
||||||
CapabilityMax = 0x7fffffff,
|
CapabilityMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1122,6 +1154,32 @@ enum FPOperationMode {
|
|||||||
FPOperationModeMax = 0x7fffffff,
|
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 {
|
enum Op {
|
||||||
OpNop = 0,
|
OpNop = 0,
|
||||||
OpUndef = 1,
|
OpUndef = 1,
|
||||||
@@ -1479,6 +1537,18 @@ enum Op {
|
|||||||
OpConvertUToAccelerationStructureKHR = 4447,
|
OpConvertUToAccelerationStructureKHR = 4447,
|
||||||
OpIgnoreIntersectionKHR = 4448,
|
OpIgnoreIntersectionKHR = 4448,
|
||||||
OpTerminateRayKHR = 4449,
|
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,
|
OpTypeRayQueryKHR = 4472,
|
||||||
OpRayQueryInitializeKHR = 4473,
|
OpRayQueryInitializeKHR = 4473,
|
||||||
OpRayQueryTerminateKHR = 4474,
|
OpRayQueryTerminateKHR = 4474,
|
||||||
@@ -1517,8 +1587,16 @@ enum Op {
|
|||||||
OpCooperativeMatrixLengthNV = 5362,
|
OpCooperativeMatrixLengthNV = 5362,
|
||||||
OpBeginInvocationInterlockEXT = 5364,
|
OpBeginInvocationInterlockEXT = 5364,
|
||||||
OpEndInvocationInterlockEXT = 5365,
|
OpEndInvocationInterlockEXT = 5365,
|
||||||
|
OpDemoteToHelperInvocation = 5380,
|
||||||
OpDemoteToHelperInvocationEXT = 5380,
|
OpDemoteToHelperInvocationEXT = 5380,
|
||||||
OpIsHelperInvocationEXT = 5381,
|
OpIsHelperInvocationEXT = 5381,
|
||||||
|
OpConvertUToImageNV = 5391,
|
||||||
|
OpConvertUToSamplerNV = 5392,
|
||||||
|
OpConvertImageToUNV = 5393,
|
||||||
|
OpConvertSamplerToUNV = 5394,
|
||||||
|
OpConvertUToSampledImageNV = 5395,
|
||||||
|
OpConvertSampledImageToUNV = 5396,
|
||||||
|
OpSamplerImageAddressingModeNV = 5397,
|
||||||
OpSubgroupShuffleINTEL = 5571,
|
OpSubgroupShuffleINTEL = 5571,
|
||||||
OpSubgroupShuffleDownINTEL = 5572,
|
OpSubgroupShuffleDownINTEL = 5572,
|
||||||
OpSubgroupShuffleUpINTEL = 5573,
|
OpSubgroupShuffleUpINTEL = 5573,
|
||||||
@@ -1543,7 +1621,7 @@ enum Op {
|
|||||||
OpUSubSatINTEL = 5596,
|
OpUSubSatINTEL = 5596,
|
||||||
OpIMul32x16INTEL = 5597,
|
OpIMul32x16INTEL = 5597,
|
||||||
OpUMul32x16INTEL = 5598,
|
OpUMul32x16INTEL = 5598,
|
||||||
OpConstFunctionPointerINTEL = 5600,
|
OpConstantFunctionPointerINTEL = 5600,
|
||||||
OpFunctionPointerCallINTEL = 5601,
|
OpFunctionPointerCallINTEL = 5601,
|
||||||
OpAsmTargetINTEL = 5609,
|
OpAsmTargetINTEL = 5609,
|
||||||
OpAsmINTEL = 5610,
|
OpAsmINTEL = 5610,
|
||||||
@@ -1677,7 +1755,59 @@ enum Op {
|
|||||||
OpVariableLengthArrayINTEL = 5818,
|
OpVariableLengthArrayINTEL = 5818,
|
||||||
OpSaveMemoryINTEL = 5819,
|
OpSaveMemoryINTEL = 5819,
|
||||||
OpRestoreMemoryINTEL = 5820,
|
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,
|
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,
|
OpPtrCastToCrossWorkgroupINTEL = 5934,
|
||||||
OpCrossWorkgroupCastToPtrINTEL = 5938,
|
OpCrossWorkgroupCastToPtrINTEL = 5938,
|
||||||
OpReadPipeBlockingINTEL = 5946,
|
OpReadPipeBlockingINTEL = 5946,
|
||||||
@@ -2069,6 +2199,12 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||||||
case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;
|
case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;
|
case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpTerminateRayKHR: *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 OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;
|
||||||
case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
|
case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
|
case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
@@ -2105,8 +2241,15 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||||||
case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break;
|
case OpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;
|
case OpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;
|
case OpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpDemoteToHelperInvocationEXT: *hasResult = false; *hasResultType = false; break;
|
case OpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; 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 OpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
@@ -2131,7 +2274,7 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||||||
case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpConstFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpAsmINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpAsmINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
@@ -2263,7 +2406,59 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||||||
case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; 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 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 OpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
|||||||
Vendored
+9
-13
@@ -111,27 +111,23 @@ public:
|
|||||||
|
|
||||||
void addStringOperand(const char* str)
|
void addStringOperand(const char* str)
|
||||||
{
|
{
|
||||||
unsigned int word;
|
unsigned int word = 0;
|
||||||
char* wordString = (char*)&word;
|
unsigned int shiftAmount = 0;
|
||||||
char* wordPtr = wordString;
|
|
||||||
int charCount = 0;
|
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
c = *(str++);
|
c = *(str++);
|
||||||
*(wordPtr++) = c;
|
word |= ((unsigned int)c) << shiftAmount;
|
||||||
++charCount;
|
shiftAmount += 8;
|
||||||
if (charCount == 4) {
|
if (shiftAmount == 32) {
|
||||||
addImmediateOperand(word);
|
addImmediateOperand(word);
|
||||||
wordPtr = wordString;
|
word = 0;
|
||||||
charCount = 0;
|
shiftAmount = 0;
|
||||||
}
|
}
|
||||||
} while (c != 0);
|
} while (c != 0);
|
||||||
|
|
||||||
// deal with partial last word
|
// deal with partial last word
|
||||||
if (charCount > 0) {
|
if (shiftAmount > 0) {
|
||||||
// pad with 0s
|
|
||||||
for (; charCount < 4; ++charCount)
|
|
||||||
*(wordPtr++) = 0;
|
|
||||||
addImmediateOperand(word);
|
addImmediateOperand(word);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+113
-8
@@ -177,6 +177,8 @@ const char* shaderStageName = nullptr;
|
|||||||
const char* variableName = nullptr;
|
const char* variableName = nullptr;
|
||||||
bool HlslEnable16BitTypes = false;
|
bool HlslEnable16BitTypes = false;
|
||||||
bool HlslDX9compatible = false;
|
bool HlslDX9compatible = false;
|
||||||
|
bool HlslDxPositionW = false;
|
||||||
|
bool EnhancedMsgs = false;
|
||||||
bool DumpBuiltinSymbols = false;
|
bool DumpBuiltinSymbols = false;
|
||||||
std::vector<std::string> IncludeDirectoryList;
|
std::vector<std::string> IncludeDirectoryList;
|
||||||
|
|
||||||
@@ -190,6 +192,9 @@ glslang::EShTargetClientVersion ClientVersion; // not valid until Client i
|
|||||||
glslang::EShTargetLanguage TargetLanguage = glslang::EShTargetNone;
|
glslang::EShTargetLanguage TargetLanguage = glslang::EShTargetNone;
|
||||||
glslang::EShTargetLanguageVersion TargetVersion; // not valid until TargetLanguage is set
|
glslang::EShTargetLanguageVersion TargetVersion; // not valid until TargetLanguage is set
|
||||||
|
|
||||||
|
// GLSL version
|
||||||
|
int GlslVersion = 0; // GLSL version specified on CLI, overrides #version in shader source
|
||||||
|
|
||||||
std::vector<std::string> Processes; // what should be recorded by OpModuleProcessed, or equivalent
|
std::vector<std::string> Processes; // what should be recorded by OpModuleProcessed, or equivalent
|
||||||
|
|
||||||
// Per descriptor-set binding base data
|
// Per descriptor-set binding base data
|
||||||
@@ -652,6 +657,48 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
|
|||||||
lowerword == "flatten-uniform-array" ||
|
lowerword == "flatten-uniform-array" ||
|
||||||
lowerword == "fua") {
|
lowerword == "fua") {
|
||||||
Options |= EOptionFlattenUniformArrays;
|
Options |= EOptionFlattenUniformArrays;
|
||||||
|
} else if (lowerword == "glsl-version") {
|
||||||
|
if (argc > 1) {
|
||||||
|
if (strcmp(argv[1], "100") == 0) {
|
||||||
|
GlslVersion = 100;
|
||||||
|
} else if (strcmp(argv[1], "110") == 0) {
|
||||||
|
GlslVersion = 110;
|
||||||
|
} else if (strcmp(argv[1], "120") == 0) {
|
||||||
|
GlslVersion = 120;
|
||||||
|
} else if (strcmp(argv[1], "130") == 0) {
|
||||||
|
GlslVersion = 130;
|
||||||
|
} else if (strcmp(argv[1], "140") == 0) {
|
||||||
|
GlslVersion = 140;
|
||||||
|
} else if (strcmp(argv[1], "150") == 0) {
|
||||||
|
GlslVersion = 150;
|
||||||
|
} else if (strcmp(argv[1], "300es") == 0) {
|
||||||
|
GlslVersion = 300;
|
||||||
|
} else if (strcmp(argv[1], "310es") == 0) {
|
||||||
|
GlslVersion = 310;
|
||||||
|
} else if (strcmp(argv[1], "320es") == 0) {
|
||||||
|
GlslVersion = 320;
|
||||||
|
} else if (strcmp(argv[1], "330") == 0) {
|
||||||
|
GlslVersion = 330;
|
||||||
|
} else if (strcmp(argv[1], "400") == 0) {
|
||||||
|
GlslVersion = 400;
|
||||||
|
} else if (strcmp(argv[1], "410") == 0) {
|
||||||
|
GlslVersion = 410;
|
||||||
|
} else if (strcmp(argv[1], "420") == 0) {
|
||||||
|
GlslVersion = 420;
|
||||||
|
} else if (strcmp(argv[1], "430") == 0) {
|
||||||
|
GlslVersion = 430;
|
||||||
|
} else if (strcmp(argv[1], "440") == 0) {
|
||||||
|
GlslVersion = 440;
|
||||||
|
} else if (strcmp(argv[1], "450") == 0) {
|
||||||
|
GlslVersion = 450;
|
||||||
|
} else if (strcmp(argv[1], "460") == 0) {
|
||||||
|
GlslVersion = 460;
|
||||||
|
} else
|
||||||
|
Error("--glsl-version expected one of: 100, 110, 120, 130, 140, 150,\n"
|
||||||
|
"300es, 310es, 320es, 330\n"
|
||||||
|
"400, 410, 420, 430, 440, 450, 460");
|
||||||
|
}
|
||||||
|
bumpArg();
|
||||||
} else if (lowerword == "hlsl-offsets") {
|
} else if (lowerword == "hlsl-offsets") {
|
||||||
Options |= EOptionHlslOffsets;
|
Options |= EOptionHlslOffsets;
|
||||||
} else if (lowerword == "hlsl-iomap" ||
|
} else if (lowerword == "hlsl-iomap" ||
|
||||||
@@ -662,6 +709,10 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
|
|||||||
HlslEnable16BitTypes = true;
|
HlslEnable16BitTypes = true;
|
||||||
} else if (lowerword == "hlsl-dx9-compatible") {
|
} else if (lowerword == "hlsl-dx9-compatible") {
|
||||||
HlslDX9compatible = true;
|
HlslDX9compatible = true;
|
||||||
|
} else if (lowerword == "hlsl-dx-position-w") {
|
||||||
|
HlslDxPositionW = true;
|
||||||
|
} else if (lowerword == "enhanced-msgs") {
|
||||||
|
EnhancedMsgs = true;
|
||||||
} else if (lowerword == "auto-sampled-textures") {
|
} else if (lowerword == "auto-sampled-textures") {
|
||||||
autoSampledTextures = true;
|
autoSampledTextures = true;
|
||||||
} else if (lowerword == "invert-y" || // synonyms
|
} else if (lowerword == "invert-y" || // synonyms
|
||||||
@@ -764,6 +815,9 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
|
|||||||
} else if (strcmp(argv[1], "vulkan1.2") == 0) {
|
} else if (strcmp(argv[1], "vulkan1.2") == 0) {
|
||||||
setVulkanSpv();
|
setVulkanSpv();
|
||||||
ClientVersion = glslang::EShTargetVulkan_1_2;
|
ClientVersion = glslang::EShTargetVulkan_1_2;
|
||||||
|
} else if (strcmp(argv[1], "vulkan1.3") == 0) {
|
||||||
|
setVulkanSpv();
|
||||||
|
ClientVersion = glslang::EShTargetVulkan_1_3;
|
||||||
} else if (strcmp(argv[1], "opengl") == 0) {
|
} else if (strcmp(argv[1], "opengl") == 0) {
|
||||||
setOpenGlSpv();
|
setOpenGlSpv();
|
||||||
ClientVersion = glslang::EShTargetOpenGL_450;
|
ClientVersion = glslang::EShTargetOpenGL_450;
|
||||||
@@ -785,9 +839,13 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
|
|||||||
} else if (strcmp(argv[1], "spirv1.5") == 0) {
|
} else if (strcmp(argv[1], "spirv1.5") == 0) {
|
||||||
TargetLanguage = glslang::EShTargetSpv;
|
TargetLanguage = glslang::EShTargetSpv;
|
||||||
TargetVersion = glslang::EShTargetSpv_1_5;
|
TargetVersion = glslang::EShTargetSpv_1_5;
|
||||||
|
} else if (strcmp(argv[1], "spirv1.6") == 0) {
|
||||||
|
TargetLanguage = glslang::EShTargetSpv;
|
||||||
|
TargetVersion = glslang::EShTargetSpv_1_6;
|
||||||
} else
|
} else
|
||||||
Error("--target-env expected one of: vulkan1.0, vulkan1.1, vulkan1.2, opengl,\n"
|
Error("--target-env expected one of: vulkan1.0, vulkan1.1, vulkan1.2,\n"
|
||||||
"spirv1.0, spirv1.1, spirv1.2, spirv1.3, spirv1.4, or spirv1.5");
|
"vulkan1.3, opengl, spirv1.0, spirv1.1, spirv1.2, spirv1.3,\n"
|
||||||
|
"spirv1.4, spirv1.5 or spirv1.6");
|
||||||
}
|
}
|
||||||
bumpArg();
|
bumpArg();
|
||||||
} else if (lowerword == "undef-macro" ||
|
} else if (lowerword == "undef-macro" ||
|
||||||
@@ -1012,6 +1070,10 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
|
|||||||
TargetLanguage = glslang::EShTargetSpv;
|
TargetLanguage = glslang::EShTargetSpv;
|
||||||
TargetVersion = glslang::EShTargetSpv_1_5;
|
TargetVersion = glslang::EShTargetSpv_1_5;
|
||||||
break;
|
break;
|
||||||
|
case glslang::EShTargetVulkan_1_3:
|
||||||
|
TargetLanguage = glslang::EShTargetSpv;
|
||||||
|
TargetVersion = glslang::EShTargetSpv_1_6;
|
||||||
|
break;
|
||||||
case glslang::EShTargetOpenGL_450:
|
case glslang::EShTargetOpenGL_450:
|
||||||
TargetLanguage = glslang::EShTargetSpv;
|
TargetLanguage = glslang::EShTargetSpv;
|
||||||
TargetVersion = glslang::EShTargetSpv_1_0;
|
TargetVersion = glslang::EShTargetSpv_1_0;
|
||||||
@@ -1059,6 +1121,8 @@ void SetMessageOptions(EShMessages& messages)
|
|||||||
messages = (EShMessages)(messages | EShMsgHlslDX9Compatible);
|
messages = (EShMessages)(messages | EShMsgHlslDX9Compatible);
|
||||||
if (DumpBuiltinSymbols)
|
if (DumpBuiltinSymbols)
|
||||||
messages = (EShMessages)(messages | EShMsgBuiltinSymbolTable);
|
messages = (EShMessages)(messages | EShMsgBuiltinSymbolTable);
|
||||||
|
if (EnhancedMsgs)
|
||||||
|
messages = (EShMessages)(messages | EShMsgEnhanced);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1149,6 +1213,27 @@ struct ShaderCompUnit {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Writes a string into a depfile, escaping some special characters following the Makefile rules.
|
||||||
|
static void writeEscapedDepString(std::ofstream& file, const std::string& str)
|
||||||
|
{
|
||||||
|
for (char c : str) {
|
||||||
|
switch (c) {
|
||||||
|
case ' ':
|
||||||
|
case ':':
|
||||||
|
case '#':
|
||||||
|
case '[':
|
||||||
|
case ']':
|
||||||
|
case '\\':
|
||||||
|
file << '\\';
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
file << '$';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
file << c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Writes a depfile similar to gcc -MMD foo.c
|
// Writes a depfile similar to gcc -MMD foo.c
|
||||||
bool writeDepFile(std::string depfile, std::vector<std::string>& binaryFiles, const std::vector<std::string>& sources)
|
bool writeDepFile(std::string depfile, std::vector<std::string>& binaryFiles, const std::vector<std::string>& sources)
|
||||||
{
|
{
|
||||||
@@ -1156,10 +1241,12 @@ bool writeDepFile(std::string depfile, std::vector<std::string>& binaryFiles, co
|
|||||||
if (file.fail())
|
if (file.fail())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (auto it = binaryFiles.begin(); it != binaryFiles.end(); it++) {
|
for (auto binaryFile = binaryFiles.begin(); binaryFile != binaryFiles.end(); binaryFile++) {
|
||||||
file << *it << ":";
|
writeEscapedDepString(file, *binaryFile);
|
||||||
for (auto it = sources.begin(); it != sources.end(); it++) {
|
file << ":";
|
||||||
file << " " << *it;
|
for (auto sourceFile = sources.begin(); sourceFile != sources.end(); sourceFile++) {
|
||||||
|
file << " ";
|
||||||
|
writeEscapedDepString(file, *sourceFile);
|
||||||
}
|
}
|
||||||
file << std::endl;
|
file << std::endl;
|
||||||
}
|
}
|
||||||
@@ -1209,6 +1296,8 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
|
|||||||
shader->setSourceEntryPoint(sourceEntryPointName);
|
shader->setSourceEntryPoint(sourceEntryPointName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shader->setOverrideVersion(GlslVersion);
|
||||||
|
|
||||||
std::string intrinsicString = getIntrinsic(compUnit.text, compUnit.count);
|
std::string intrinsicString = getIntrinsic(compUnit.text, compUnit.count);
|
||||||
|
|
||||||
PreambleString = "";
|
PreambleString = "";
|
||||||
@@ -1284,6 +1373,12 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
|
|||||||
if (Options & EOptionInvertY)
|
if (Options & EOptionInvertY)
|
||||||
shader->setInvertY(true);
|
shader->setInvertY(true);
|
||||||
|
|
||||||
|
if (HlslDxPositionW)
|
||||||
|
shader->setDxPositionW(true);
|
||||||
|
|
||||||
|
if (EnhancedMsgs)
|
||||||
|
shader->setEnhancedMsgs();
|
||||||
|
|
||||||
// Set up the environment, some subsettings take precedence over earlier
|
// Set up the environment, some subsettings take precedence over earlier
|
||||||
// ways of setting things.
|
// ways of setting things.
|
||||||
if (Options & EOptionSpv) {
|
if (Options & EOptionSpv) {
|
||||||
@@ -1840,6 +1935,11 @@ void usage()
|
|||||||
" -dumpfullversion | -dumpversion print bare major.minor.patchlevel\n"
|
" -dumpfullversion | -dumpversion print bare major.minor.patchlevel\n"
|
||||||
" --flatten-uniform-arrays | --fua flatten uniform texture/sampler arrays to\n"
|
" --flatten-uniform-arrays | --fua flatten uniform texture/sampler arrays to\n"
|
||||||
" scalars\n"
|
" scalars\n"
|
||||||
|
" --glsl-version {100 | 110 | 120 | 130 | 140 | 150 |\n"
|
||||||
|
" 300es | 310es | 320es | 330\n"
|
||||||
|
" 400 | 410 | 420 | 430 | 440 | 450 | 460}\n"
|
||||||
|
" set GLSL version, overrides #version\n"
|
||||||
|
" in shader sourcen\n"
|
||||||
" --hlsl-offsets allow block offsets to follow HLSL rules\n"
|
" --hlsl-offsets allow block offsets to follow HLSL rules\n"
|
||||||
" works independently of source language\n"
|
" works independently of source language\n"
|
||||||
" --hlsl-iomap perform IO mapping in HLSL register space\n"
|
" --hlsl-iomap perform IO mapping in HLSL register space\n"
|
||||||
@@ -1847,7 +1947,10 @@ void usage()
|
|||||||
" --hlsl-dx9-compatible interprets sampler declarations as a\n"
|
" --hlsl-dx9-compatible interprets sampler declarations as a\n"
|
||||||
" texture/sampler combo like DirectX9 would,\n"
|
" texture/sampler combo like DirectX9 would,\n"
|
||||||
" and recognizes DirectX9-specific semantics\n"
|
" and recognizes DirectX9-specific semantics\n"
|
||||||
|
" --hlsl-dx-position-w W component of SV_Position in HLSL fragment\n"
|
||||||
|
" shaders compatible with DirectX\n"
|
||||||
" --invert-y | --iy invert position.Y output in vertex shader\n"
|
" --invert-y | --iy invert position.Y output in vertex shader\n"
|
||||||
|
" --enhanced-msgs print more readable error messages (GLSL only)\n"
|
||||||
" --keep-uncalled | --ku don't eliminate uncalled functions\n"
|
" --keep-uncalled | --ku don't eliminate uncalled functions\n"
|
||||||
" --nan-clamp favor non-NaN operand in min, max, and clamp\n"
|
" --nan-clamp favor non-NaN operand in min, max, and clamp\n"
|
||||||
" --no-storage-format | --nsf use Unknown image format\n"
|
" --no-storage-format | --nsf use Unknown image format\n"
|
||||||
@@ -1922,8 +2025,9 @@ void usage()
|
|||||||
" --sep synonym for --source-entrypoint\n"
|
" --sep synonym for --source-entrypoint\n"
|
||||||
" --stdin read from stdin instead of from a file;\n"
|
" --stdin read from stdin instead of from a file;\n"
|
||||||
" requires providing the shader stage using -S\n"
|
" requires providing the shader stage using -S\n"
|
||||||
" --target-env {vulkan1.0 | vulkan1.1 | vulkan1.2 | opengl | \n"
|
" --target-env {vulkan1.0 | vulkan1.1 | vulkan1.2 | vulkan1.3 | opengl |\n"
|
||||||
" spirv1.0 | spirv1.1 | spirv1.2 | spirv1.3 | spirv1.4 | spirv1.5}\n"
|
" spirv1.0 | spirv1.1 | spirv1.2 | spirv1.3 | spirv1.4 |\n"
|
||||||
|
" spirv1.5 | spirv1.6}\n"
|
||||||
" Set the execution environment that the\n"
|
" Set the execution environment that the\n"
|
||||||
" generated code will be executed in.\n"
|
" generated code will be executed in.\n"
|
||||||
" Defaults to:\n"
|
" Defaults to:\n"
|
||||||
@@ -1932,6 +2036,7 @@ void usage()
|
|||||||
" * spirv1.0 under --target-env vulkan1.0\n"
|
" * spirv1.0 under --target-env vulkan1.0\n"
|
||||||
" * spirv1.3 under --target-env vulkan1.1\n"
|
" * spirv1.3 under --target-env vulkan1.1\n"
|
||||||
" * spirv1.5 under --target-env vulkan1.2\n"
|
" * spirv1.5 under --target-env vulkan1.2\n"
|
||||||
|
" * spirv1.6 under --target-env vulkan1.3\n"
|
||||||
" Multiple --target-env can be specified.\n"
|
" Multiple --target-env can be specified.\n"
|
||||||
" --variable-name <name>\n"
|
" --variable-name <name>\n"
|
||||||
" --vn <name> creates a C header file that contains a\n"
|
" --vn <name> creates a C header file that contains a\n"
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# Copyright (c) 2020 Google Inc.
|
# Copyright (c) 2020 Google Inc.
|
||||||
#
|
#
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# Copyright (c) 2020 Google Inc.
|
# Copyright (c) 2020 Google Inc.
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -244,6 +244,8 @@ c_shader_target_language_version(glslang_target_language_version_t target_langua
|
|||||||
return glslang::EShTargetSpv_1_4;
|
return glslang::EShTargetSpv_1_4;
|
||||||
case GLSLANG_TARGET_SPV_1_5:
|
case GLSLANG_TARGET_SPV_1_5:
|
||||||
return glslang::EShTargetSpv_1_5;
|
return glslang::EShTargetSpv_1_5;
|
||||||
|
case GLSLANG_TARGET_SPV_1_6:
|
||||||
|
return glslang::EShTargetSpv_1_6;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -269,6 +271,10 @@ static glslang::EShTargetClientVersion c_shader_client_version(glslang_target_cl
|
|||||||
switch (client_version) {
|
switch (client_version) {
|
||||||
case GLSLANG_TARGET_VULKAN_1_1:
|
case GLSLANG_TARGET_VULKAN_1_1:
|
||||||
return glslang::EShTargetVulkan_1_1;
|
return glslang::EShTargetVulkan_1_1;
|
||||||
|
case GLSLANG_TARGET_VULKAN_1_2:
|
||||||
|
return glslang::EShTargetVulkan_1_2;
|
||||||
|
case GLSLANG_TARGET_VULKAN_1_3:
|
||||||
|
return glslang::EShTargetVulkan_1_3;
|
||||||
case GLSLANG_TARGET_OPENGL_450:
|
case GLSLANG_TARGET_OPENGL_450:
|
||||||
return glslang::EShTargetOpenGL_450;
|
return glslang::EShTargetOpenGL_450;
|
||||||
default:
|
default:
|
||||||
@@ -344,6 +350,38 @@ GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* in
|
|||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
shader->shader->setShiftBinding(res_type, 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)
|
||||||
|
{
|
||||||
|
const glslang::TResourceType res_type = glslang::TResourceType(res);
|
||||||
|
shader->shader->setShiftBindingForSet(res_type, base, set);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLSLANG_EXPORT void glslang_shader_set_options(glslang_shader_t* shader, int options)
|
||||||
|
{
|
||||||
|
if (options & GLSLANG_SHADER_AUTO_MAP_BINDINGS) {
|
||||||
|
shader->shader->setAutoMapBindings(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options & GLSLANG_SHADER_AUTO_MAP_LOCATIONS) {
|
||||||
|
shader->shader->setAutoMapLocations(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options & GLSLANG_SHADER_VULKAN_RULES_RELAXED) {
|
||||||
|
shader->shader->setEnvInputVulkanRulesRelaxed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GLSLANG_EXPORT void glslang_shader_set_glsl_version(glslang_shader_t* shader, int version)
|
||||||
|
{
|
||||||
|
shader->shader->setOverrideVersion(version);
|
||||||
|
}
|
||||||
|
|
||||||
GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader)
|
GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader)
|
||||||
{
|
{
|
||||||
return shader->preprocessedGLSL.c_str();
|
return shader->preprocessedGLSL.c_str();
|
||||||
@@ -417,6 +455,11 @@ GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages
|
|||||||
return (int)program->program->link((EShMessages)messages);
|
return (int)program->program->link((EShMessages)messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLSLANG_EXPORT int glslang_program_map_io(glslang_program_t* program)
|
||||||
|
{
|
||||||
|
return (int)program->program->mapIO();
|
||||||
|
}
|
||||||
|
|
||||||
GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program)
|
GLSLANG_EXPORT const char* glslang_program_get_info_log(glslang_program_t* program)
|
||||||
{
|
{
|
||||||
return program->program->getInfoLog();
|
return program->program->getInfoLog();
|
||||||
|
|||||||
-16
@@ -36,19 +36,3 @@
|
|||||||
// POSSIBILITY OF SUCH DAMAGE.
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
//
|
||||||
|
|
||||||
#extension GL_EXT_spirv_intrinsics : enable
|
|
||||||
#extension GL_ARB_gpu_shader_int64 : enable
|
|
||||||
|
|
||||||
uvec2 clockRealtime2x32EXT(void) {
|
|
||||||
spirv_instruction (extensions = ["SPV_KHR_shader_clock"], capabilities = [5055], id = 5056)
|
|
||||||
uvec2 clockRealtime2x32EXT_internal(uint scope);
|
|
||||||
|
|
||||||
return clockRealtime2x32EXT_internal(1 /*Device scope*/);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t clockRealtimeEXT(void) {
|
|
||||||
spirv_instruction (extensions = ["SPV_KHR_shader_clock"], capabilities = [5055], id = 5056)
|
|
||||||
uint64_t clockRealtimeEXT_internal(uint scope);
|
|
||||||
|
|
||||||
return clockRealtimeEXT_internal(1 /*Device scope*/);
|
|
||||||
}
|
|
||||||
+80
-4
@@ -2167,8 +2167,21 @@ TIntermNode* HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunct
|
|||||||
TIntermSymbol* arg = intermediate.addSymbol(*argVars.back());
|
TIntermSymbol* arg = intermediate.addSymbol(*argVars.back());
|
||||||
handleFunctionArgument(&callee, callingArgs, arg);
|
handleFunctionArgument(&callee, callingArgs, arg);
|
||||||
if (param.type->getQualifier().isParamInput()) {
|
if (param.type->getQualifier().isParamInput()) {
|
||||||
intermediate.growAggregate(synthBody, handleAssign(loc, EOpAssign, arg,
|
TIntermTyped* input = intermediate.addSymbol(**inputIt);
|
||||||
intermediate.addSymbol(**inputIt)));
|
if (input->getType().getQualifier().builtIn == EbvFragCoord && intermediate.getDxPositionW()) {
|
||||||
|
// Replace FragCoord W with reciprocal
|
||||||
|
auto pos_xyz = handleDotDereference(loc, input, "xyz");
|
||||||
|
auto pos_w = handleDotDereference(loc, input, "w");
|
||||||
|
auto one = intermediate.addConstantUnion(1.0, EbtFloat, loc);
|
||||||
|
auto recip_w = intermediate.addBinaryMath(EOpDiv, one, pos_w, loc);
|
||||||
|
TIntermAggregate* dst = new TIntermAggregate(EOpConstructVec4);
|
||||||
|
dst->getSequence().push_back(pos_xyz);
|
||||||
|
dst->getSequence().push_back(recip_w);
|
||||||
|
dst->setType(TType(EbtFloat, EvqTemporary, 4));
|
||||||
|
dst->setLoc(loc);
|
||||||
|
input = dst;
|
||||||
|
}
|
||||||
|
intermediate.growAggregate(synthBody, handleAssign(loc, EOpAssign, arg, input));
|
||||||
inputIt++;
|
inputIt++;
|
||||||
}
|
}
|
||||||
if (param.type->getQualifier().storage == EvqUniform) {
|
if (param.type->getQualifier().storage == EvqUniform) {
|
||||||
@@ -2452,6 +2465,62 @@ void HlslParseContext::handleFunctionArgument(TFunction* function,
|
|||||||
arguments = newArg;
|
arguments = newArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FragCoord may require special loading: we can optionally reciprocate W.
|
||||||
|
TIntermTyped* HlslParseContext::assignFromFragCoord(const TSourceLoc& loc, TOperator op,
|
||||||
|
TIntermTyped* left, TIntermTyped* right)
|
||||||
|
{
|
||||||
|
// If we are not asked for reciprocal W, use a plain old assign.
|
||||||
|
if (!intermediate.getDxPositionW())
|
||||||
|
return intermediate.addAssign(op, left, right, loc);
|
||||||
|
|
||||||
|
// If we get here, we should reciprocate W.
|
||||||
|
TIntermAggregate* assignList = nullptr;
|
||||||
|
|
||||||
|
// If this is a complex rvalue, we don't want to dereference it many times. Create a temporary.
|
||||||
|
TVariable* rhsTempVar = nullptr;
|
||||||
|
rhsTempVar = makeInternalVariable("@fragcoord", right->getType());
|
||||||
|
rhsTempVar->getWritableType().getQualifier().makeTemporary();
|
||||||
|
|
||||||
|
{
|
||||||
|
TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc);
|
||||||
|
assignList = intermediate.growAggregate(assignList,
|
||||||
|
intermediate.addAssign(EOpAssign, rhsTempSym, right, loc), loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// tmp.w = 1.0 / tmp.w
|
||||||
|
{
|
||||||
|
const int W = 3;
|
||||||
|
|
||||||
|
TIntermTyped* tempSymL = intermediate.addSymbol(*rhsTempVar, loc);
|
||||||
|
TIntermTyped* tempSymR = intermediate.addSymbol(*rhsTempVar, loc);
|
||||||
|
TIntermTyped* index = intermediate.addConstantUnion(W, loc);
|
||||||
|
|
||||||
|
TIntermTyped* lhsElement = intermediate.addIndex(EOpIndexDirect, tempSymL, index, loc);
|
||||||
|
TIntermTyped* rhsElement = intermediate.addIndex(EOpIndexDirect, tempSymR, index, loc);
|
||||||
|
|
||||||
|
const TType derefType(right->getType(), 0);
|
||||||
|
|
||||||
|
lhsElement->setType(derefType);
|
||||||
|
rhsElement->setType(derefType);
|
||||||
|
|
||||||
|
auto one = intermediate.addConstantUnion(1.0, EbtFloat, loc);
|
||||||
|
auto recip_w = intermediate.addBinaryMath(EOpDiv, one, rhsElement, loc);
|
||||||
|
|
||||||
|
assignList = intermediate.growAggregate(assignList, intermediate.addAssign(EOpAssign, lhsElement, recip_w, loc));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign the rhs temp (now with W reciprocal) to the final output
|
||||||
|
{
|
||||||
|
TIntermTyped* rhsTempSym = intermediate.addSymbol(*rhsTempVar, loc);
|
||||||
|
assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, left, rhsTempSym, loc));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(assignList != nullptr);
|
||||||
|
assignList->setOperator(EOpSequence);
|
||||||
|
|
||||||
|
return assignList;
|
||||||
|
}
|
||||||
|
|
||||||
// Position may require special handling: we can optionally invert Y.
|
// Position may require special handling: we can optionally invert Y.
|
||||||
// See: https://github.com/KhronosGroup/glslang/issues/1173
|
// See: https://github.com/KhronosGroup/glslang/issues/1173
|
||||||
// https://github.com/KhronosGroup/glslang/issues/494
|
// https://github.com/KhronosGroup/glslang/issues/494
|
||||||
@@ -3071,6 +3140,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
|
|||||||
subSplitLeft, subSplitRight);
|
subSplitLeft, subSplitRight);
|
||||||
|
|
||||||
assignList = intermediate.growAggregate(assignList, clipCullAssign, loc);
|
assignList = intermediate.growAggregate(assignList, clipCullAssign, loc);
|
||||||
|
} else if (subSplitRight->getType().getQualifier().builtIn == EbvFragCoord) {
|
||||||
|
// FragCoord can require special handling: see comment above assignFromFragCoord
|
||||||
|
TIntermTyped* fragCoordAssign = assignFromFragCoord(loc, op, subSplitLeft, subSplitRight);
|
||||||
|
assignList = intermediate.growAggregate(assignList, fragCoordAssign, loc);
|
||||||
} else if (assignsClipPos(subSplitLeft)) {
|
} else if (assignsClipPos(subSplitLeft)) {
|
||||||
// Position can require special handling: see comment above assignPosition
|
// Position can require special handling: see comment above assignPosition
|
||||||
TIntermTyped* positionAssign = assignPosition(loc, op, subSplitLeft, subSplitRight);
|
TIntermTyped* positionAssign = assignPosition(loc, op, subSplitLeft, subSplitRight);
|
||||||
@@ -5357,7 +5430,7 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
|
|||||||
}
|
}
|
||||||
case EOpWavePrefixCountBits:
|
case EOpWavePrefixCountBits:
|
||||||
{
|
{
|
||||||
// Mapped to subgroupBallotInclusiveBitCount(subgroupBallot())
|
// Mapped to subgroupBallotExclusiveBitCount(subgroupBallot())
|
||||||
// builtin
|
// builtin
|
||||||
|
|
||||||
// uvec4 type.
|
// uvec4 type.
|
||||||
@@ -5371,7 +5444,7 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
|
|||||||
TType uintType(EbtUint, EvqTemporary);
|
TType uintType(EbtUint, EvqTemporary);
|
||||||
|
|
||||||
node = intermediate.addBuiltInFunctionCall(loc,
|
node = intermediate.addBuiltInFunctionCall(loc,
|
||||||
EOpSubgroupBallotInclusiveBitCount, true, res, uintType);
|
EOpSubgroupBallotExclusiveBitCount, true, res, uintType);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -6935,6 +7008,9 @@ void HlslParseContext::shareStructBufferType(TType& type)
|
|||||||
if (lhs.isStruct() != rhs.isStruct())
|
if (lhs.isStruct() != rhs.isStruct())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (lhs.getQualifier().builtIn != rhs.getQualifier().builtIn)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (lhs.isStruct() && rhs.isStruct()) {
|
if (lhs.isStruct() && rhs.isStruct()) {
|
||||||
if (lhs.getStruct()->size() != rhs.getStruct()->size())
|
if (lhs.getStruct()->size() != rhs.getStruct()->size())
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ public:
|
|||||||
TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*);
|
TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*);
|
||||||
TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, int semanticId, TIntermTyped* left, TIntermTyped* right);
|
TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, int semanticId, TIntermTyped* left, TIntermTyped* right);
|
||||||
TIntermTyped* assignPosition(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
|
TIntermTyped* assignPosition(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
|
||||||
|
TIntermTyped* assignFromFragCoord(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
|
||||||
void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
|
void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
|
||||||
void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
|
void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
|
||||||
void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
|
void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments);
|
||||||
|
|||||||
+33
@@ -39,6 +39,11 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <cfloat>
|
||||||
|
#else
|
||||||
|
#include <cmath>
|
||||||
|
#endif
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <list>
|
#include <list>
|
||||||
@@ -302,6 +307,34 @@ template <class T> int IntLog2(T n)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool IsInfinity(double x) {
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
switch (_fpclass(x)) {
|
||||||
|
case _FPCLASS_NINF:
|
||||||
|
case _FPCLASS_PINF:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return std::isinf(x);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool IsNan(double x) {
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
switch (_fpclass(x)) {
|
||||||
|
case _FPCLASS_SNAN:
|
||||||
|
case _FPCLASS_QNAN:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
return std::isnan(x);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace glslang
|
} // end namespace glslang
|
||||||
|
|
||||||
#endif // _COMMON_INCLUDED_
|
#endif // _COMMON_INCLUDED_
|
||||||
|
|||||||
+337
-186
@@ -1865,10 +1865,12 @@ public:
|
|||||||
bool isAtomic() const { return false; }
|
bool isAtomic() const { return false; }
|
||||||
bool isCoopMat() const { return false; }
|
bool isCoopMat() const { return false; }
|
||||||
bool isReference() const { return false; }
|
bool isReference() const { return false; }
|
||||||
|
bool isSpirvType() const { return false; }
|
||||||
#else
|
#else
|
||||||
bool isAtomic() const { return basicType == EbtAtomicUint; }
|
bool isAtomic() const { return basicType == EbtAtomicUint; }
|
||||||
bool isCoopMat() const { return coopmat; }
|
bool isCoopMat() const { return coopmat; }
|
||||||
bool isReference() const { return getBasicType() == EbtReference; }
|
bool isReference() const { return getBasicType() == EbtReference; }
|
||||||
|
bool isSpirvType() const { return getBasicType() == EbtSpirvType; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// return true if this type contains any subtype which satisfies the given predicate.
|
// return true if this type contains any subtype which satisfies the given predicate.
|
||||||
@@ -2140,7 +2142,8 @@ public:
|
|||||||
const char* getPrecisionQualifierString() const { return ""; }
|
const char* getPrecisionQualifierString() const { return ""; }
|
||||||
TString getBasicTypeString() const { return ""; }
|
TString getBasicTypeString() const { return ""; }
|
||||||
#else
|
#else
|
||||||
TString getCompleteString() const
|
TString getCompleteString(bool syntactic = false, bool getQualifiers = true, bool getPrecision = true,
|
||||||
|
bool getType = true, TString name = "", TString structName = "") const
|
||||||
{
|
{
|
||||||
TString typeString;
|
TString typeString;
|
||||||
|
|
||||||
@@ -2148,232 +2151,335 @@ public:
|
|||||||
const auto appendUint = [&](unsigned int u) { typeString.append(std::to_string(u).c_str()); };
|
const auto appendUint = [&](unsigned int u) { typeString.append(std::to_string(u).c_str()); };
|
||||||
const auto appendInt = [&](int i) { typeString.append(std::to_string(i).c_str()); };
|
const auto appendInt = [&](int i) { typeString.append(std::to_string(i).c_str()); };
|
||||||
|
|
||||||
if (qualifier.hasSprivDecorate())
|
if (getQualifiers) {
|
||||||
|
if (qualifier.hasSprivDecorate())
|
||||||
appendStr(qualifier.getSpirvDecorateQualifierString().c_str());
|
appendStr(qualifier.getSpirvDecorateQualifierString().c_str());
|
||||||
|
|
||||||
if (qualifier.hasLayout()) {
|
if (qualifier.hasLayout()) {
|
||||||
// To reduce noise, skip this if the only layout is an xfb_buffer
|
// To reduce noise, skip this if the only layout is an xfb_buffer
|
||||||
// with no triggering xfb_offset.
|
// with no triggering xfb_offset.
|
||||||
TQualifier noXfbBuffer = qualifier;
|
TQualifier noXfbBuffer = qualifier;
|
||||||
noXfbBuffer.layoutXfbBuffer = TQualifier::layoutXfbBufferEnd;
|
noXfbBuffer.layoutXfbBuffer = TQualifier::layoutXfbBufferEnd;
|
||||||
if (noXfbBuffer.hasLayout()) {
|
if (noXfbBuffer.hasLayout()) {
|
||||||
appendStr("layout(");
|
appendStr("layout(");
|
||||||
if (qualifier.hasAnyLocation()) {
|
if (qualifier.hasAnyLocation()) {
|
||||||
appendStr(" location=");
|
appendStr(" location=");
|
||||||
appendUint(qualifier.layoutLocation);
|
appendUint(qualifier.layoutLocation);
|
||||||
if (qualifier.hasComponent()) {
|
if (qualifier.hasComponent()) {
|
||||||
appendStr(" component=");
|
appendStr(" component=");
|
||||||
appendUint(qualifier.layoutComponent);
|
appendUint(qualifier.layoutComponent);
|
||||||
}
|
|
||||||
if (qualifier.hasIndex()) {
|
|
||||||
appendStr(" index=");
|
|
||||||
appendUint(qualifier.layoutIndex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (qualifier.hasSet()) {
|
if (qualifier.hasIndex()) {
|
||||||
appendStr(" set=");
|
appendStr(" index=");
|
||||||
appendUint(qualifier.layoutSet);
|
appendUint(qualifier.layoutIndex);
|
||||||
}
|
|
||||||
if (qualifier.hasBinding()) {
|
|
||||||
appendStr(" binding=");
|
|
||||||
appendUint(qualifier.layoutBinding);
|
|
||||||
}
|
|
||||||
if (qualifier.hasStream()) {
|
|
||||||
appendStr(" stream=");
|
|
||||||
appendUint(qualifier.layoutStream);
|
|
||||||
}
|
|
||||||
if (qualifier.hasMatrix()) {
|
|
||||||
appendStr(" ");
|
|
||||||
appendStr(TQualifier::getLayoutMatrixString(qualifier.layoutMatrix));
|
|
||||||
}
|
|
||||||
if (qualifier.hasPacking()) {
|
|
||||||
appendStr(" ");
|
|
||||||
appendStr(TQualifier::getLayoutPackingString(qualifier.layoutPacking));
|
|
||||||
}
|
|
||||||
if (qualifier.hasOffset()) {
|
|
||||||
appendStr(" offset=");
|
|
||||||
appendInt(qualifier.layoutOffset);
|
|
||||||
}
|
|
||||||
if (qualifier.hasAlign()) {
|
|
||||||
appendStr(" align=");
|
|
||||||
appendInt(qualifier.layoutAlign);
|
|
||||||
}
|
|
||||||
if (qualifier.hasFormat()) {
|
|
||||||
appendStr(" ");
|
|
||||||
appendStr(TQualifier::getLayoutFormatString(qualifier.layoutFormat));
|
|
||||||
}
|
|
||||||
if (qualifier.hasXfbBuffer() && qualifier.hasXfbOffset()) {
|
|
||||||
appendStr(" xfb_buffer=");
|
|
||||||
appendUint(qualifier.layoutXfbBuffer);
|
|
||||||
}
|
|
||||||
if (qualifier.hasXfbOffset()) {
|
|
||||||
appendStr(" xfb_offset=");
|
|
||||||
appendUint(qualifier.layoutXfbOffset);
|
|
||||||
}
|
|
||||||
if (qualifier.hasXfbStride()) {
|
|
||||||
appendStr(" xfb_stride=");
|
|
||||||
appendUint(qualifier.layoutXfbStride);
|
|
||||||
}
|
|
||||||
if (qualifier.hasAttachment()) {
|
|
||||||
appendStr(" input_attachment_index=");
|
|
||||||
appendUint(qualifier.layoutAttachment);
|
|
||||||
}
|
|
||||||
if (qualifier.hasSpecConstantId()) {
|
|
||||||
appendStr(" constant_id=");
|
|
||||||
appendUint(qualifier.layoutSpecConstantId);
|
|
||||||
}
|
|
||||||
if (qualifier.layoutPushConstant)
|
|
||||||
appendStr(" push_constant");
|
|
||||||
if (qualifier.layoutBufferReference)
|
|
||||||
appendStr(" buffer_reference");
|
|
||||||
if (qualifier.hasBufferReferenceAlign()) {
|
|
||||||
appendStr(" buffer_reference_align=");
|
|
||||||
appendUint(1u << qualifier.layoutBufferReferenceAlign);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (qualifier.hasSet()) {
|
||||||
|
appendStr(" set=");
|
||||||
|
appendUint(qualifier.layoutSet);
|
||||||
|
}
|
||||||
|
if (qualifier.hasBinding()) {
|
||||||
|
appendStr(" binding=");
|
||||||
|
appendUint(qualifier.layoutBinding);
|
||||||
|
}
|
||||||
|
if (qualifier.hasStream()) {
|
||||||
|
appendStr(" stream=");
|
||||||
|
appendUint(qualifier.layoutStream);
|
||||||
|
}
|
||||||
|
if (qualifier.hasMatrix()) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(TQualifier::getLayoutMatrixString(qualifier.layoutMatrix));
|
||||||
|
}
|
||||||
|
if (qualifier.hasPacking()) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(TQualifier::getLayoutPackingString(qualifier.layoutPacking));
|
||||||
|
}
|
||||||
|
if (qualifier.hasOffset()) {
|
||||||
|
appendStr(" offset=");
|
||||||
|
appendInt(qualifier.layoutOffset);
|
||||||
|
}
|
||||||
|
if (qualifier.hasAlign()) {
|
||||||
|
appendStr(" align=");
|
||||||
|
appendInt(qualifier.layoutAlign);
|
||||||
|
}
|
||||||
|
if (qualifier.hasFormat()) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(TQualifier::getLayoutFormatString(qualifier.layoutFormat));
|
||||||
|
}
|
||||||
|
if (qualifier.hasXfbBuffer() && qualifier.hasXfbOffset()) {
|
||||||
|
appendStr(" xfb_buffer=");
|
||||||
|
appendUint(qualifier.layoutXfbBuffer);
|
||||||
|
}
|
||||||
|
if (qualifier.hasXfbOffset()) {
|
||||||
|
appendStr(" xfb_offset=");
|
||||||
|
appendUint(qualifier.layoutXfbOffset);
|
||||||
|
}
|
||||||
|
if (qualifier.hasXfbStride()) {
|
||||||
|
appendStr(" xfb_stride=");
|
||||||
|
appendUint(qualifier.layoutXfbStride);
|
||||||
|
}
|
||||||
|
if (qualifier.hasAttachment()) {
|
||||||
|
appendStr(" input_attachment_index=");
|
||||||
|
appendUint(qualifier.layoutAttachment);
|
||||||
|
}
|
||||||
|
if (qualifier.hasSpecConstantId()) {
|
||||||
|
appendStr(" constant_id=");
|
||||||
|
appendUint(qualifier.layoutSpecConstantId);
|
||||||
|
}
|
||||||
|
if (qualifier.layoutPushConstant)
|
||||||
|
appendStr(" push_constant");
|
||||||
|
if (qualifier.layoutBufferReference)
|
||||||
|
appendStr(" buffer_reference");
|
||||||
|
if (qualifier.hasBufferReferenceAlign()) {
|
||||||
|
appendStr(" buffer_reference_align=");
|
||||||
|
appendUint(1u << qualifier.layoutBufferReferenceAlign);
|
||||||
|
}
|
||||||
|
|
||||||
if (qualifier.layoutPassthrough)
|
if (qualifier.layoutPassthrough)
|
||||||
appendStr(" passthrough");
|
appendStr(" passthrough");
|
||||||
if (qualifier.layoutViewportRelative)
|
if (qualifier.layoutViewportRelative)
|
||||||
appendStr(" layoutViewportRelative");
|
appendStr(" layoutViewportRelative");
|
||||||
if (qualifier.layoutSecondaryViewportRelativeOffset != -2048) {
|
if (qualifier.layoutSecondaryViewportRelativeOffset != -2048) {
|
||||||
appendStr(" layoutSecondaryViewportRelativeOffset=");
|
appendStr(" layoutSecondaryViewportRelativeOffset=");
|
||||||
appendInt(qualifier.layoutSecondaryViewportRelativeOffset);
|
appendInt(qualifier.layoutSecondaryViewportRelativeOffset);
|
||||||
}
|
}
|
||||||
if (qualifier.layoutShaderRecord)
|
if (qualifier.layoutShaderRecord)
|
||||||
appendStr(" shaderRecordNV");
|
appendStr(" shaderRecordNV");
|
||||||
|
|
||||||
appendStr(")");
|
appendStr(")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qualifier.invariant)
|
if (qualifier.invariant)
|
||||||
appendStr(" invariant");
|
appendStr(" invariant");
|
||||||
if (qualifier.noContraction)
|
if (qualifier.noContraction)
|
||||||
appendStr(" noContraction");
|
appendStr(" noContraction");
|
||||||
if (qualifier.centroid)
|
if (qualifier.centroid)
|
||||||
appendStr(" centroid");
|
appendStr(" centroid");
|
||||||
if (qualifier.smooth)
|
if (qualifier.smooth)
|
||||||
appendStr(" smooth");
|
appendStr(" smooth");
|
||||||
if (qualifier.flat)
|
if (qualifier.flat)
|
||||||
appendStr(" flat");
|
appendStr(" flat");
|
||||||
if (qualifier.nopersp)
|
if (qualifier.nopersp)
|
||||||
appendStr(" noperspective");
|
appendStr(" noperspective");
|
||||||
if (qualifier.explicitInterp)
|
if (qualifier.explicitInterp)
|
||||||
appendStr(" __explicitInterpAMD");
|
appendStr(" __explicitInterpAMD");
|
||||||
if (qualifier.pervertexNV)
|
if (qualifier.pervertexNV)
|
||||||
appendStr(" pervertexNV");
|
appendStr(" pervertexNV");
|
||||||
if (qualifier.perPrimitiveNV)
|
if (qualifier.perPrimitiveNV)
|
||||||
appendStr(" perprimitiveNV");
|
appendStr(" perprimitiveNV");
|
||||||
if (qualifier.perViewNV)
|
if (qualifier.perViewNV)
|
||||||
appendStr(" perviewNV");
|
appendStr(" perviewNV");
|
||||||
if (qualifier.perTaskNV)
|
if (qualifier.perTaskNV)
|
||||||
appendStr(" taskNV");
|
appendStr(" taskNV");
|
||||||
if (qualifier.patch)
|
if (qualifier.patch)
|
||||||
appendStr(" patch");
|
appendStr(" patch");
|
||||||
if (qualifier.sample)
|
if (qualifier.sample)
|
||||||
appendStr(" sample");
|
appendStr(" sample");
|
||||||
if (qualifier.coherent)
|
if (qualifier.coherent)
|
||||||
appendStr(" coherent");
|
appendStr(" coherent");
|
||||||
if (qualifier.devicecoherent)
|
if (qualifier.devicecoherent)
|
||||||
appendStr(" devicecoherent");
|
appendStr(" devicecoherent");
|
||||||
if (qualifier.queuefamilycoherent)
|
if (qualifier.queuefamilycoherent)
|
||||||
appendStr(" queuefamilycoherent");
|
appendStr(" queuefamilycoherent");
|
||||||
if (qualifier.workgroupcoherent)
|
if (qualifier.workgroupcoherent)
|
||||||
appendStr(" workgroupcoherent");
|
appendStr(" workgroupcoherent");
|
||||||
if (qualifier.subgroupcoherent)
|
if (qualifier.subgroupcoherent)
|
||||||
appendStr(" subgroupcoherent");
|
appendStr(" subgroupcoherent");
|
||||||
if (qualifier.shadercallcoherent)
|
if (qualifier.shadercallcoherent)
|
||||||
appendStr(" shadercallcoherent");
|
appendStr(" shadercallcoherent");
|
||||||
if (qualifier.nonprivate)
|
if (qualifier.nonprivate)
|
||||||
appendStr(" nonprivate");
|
appendStr(" nonprivate");
|
||||||
if (qualifier.volatil)
|
if (qualifier.volatil)
|
||||||
appendStr(" volatile");
|
appendStr(" volatile");
|
||||||
if (qualifier.restrict)
|
if (qualifier.restrict)
|
||||||
appendStr(" restrict");
|
appendStr(" restrict");
|
||||||
if (qualifier.readonly)
|
if (qualifier.readonly)
|
||||||
appendStr(" readonly");
|
appendStr(" readonly");
|
||||||
if (qualifier.writeonly)
|
if (qualifier.writeonly)
|
||||||
appendStr(" writeonly");
|
appendStr(" writeonly");
|
||||||
if (qualifier.specConstant)
|
if (qualifier.specConstant)
|
||||||
appendStr(" specialization-constant");
|
appendStr(" specialization-constant");
|
||||||
if (qualifier.nonUniform)
|
if (qualifier.nonUniform)
|
||||||
appendStr(" nonuniform");
|
appendStr(" nonuniform");
|
||||||
if (qualifier.isNullInit())
|
if (qualifier.isNullInit())
|
||||||
appendStr(" null-init");
|
appendStr(" null-init");
|
||||||
if (qualifier.isSpirvByReference())
|
if (qualifier.isSpirvByReference())
|
||||||
appendStr(" spirv_by_reference");
|
appendStr(" spirv_by_reference");
|
||||||
if (qualifier.isSpirvLiteral())
|
if (qualifier.isSpirvLiteral())
|
||||||
appendStr(" spirv_literal");
|
appendStr(" spirv_literal");
|
||||||
appendStr(" ");
|
appendStr(" ");
|
||||||
appendStr(getStorageQualifierString());
|
appendStr(getStorageQualifierString());
|
||||||
if (isArray()) {
|
}
|
||||||
for(int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
|
if (getType) {
|
||||||
|
if (syntactic) {
|
||||||
|
if (getPrecision && qualifier.precision != EpqNone) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(getPrecisionQualifierString());
|
||||||
|
}
|
||||||
|
if (isVector() || isMatrix()) {
|
||||||
|
appendStr(" ");
|
||||||
|
switch (basicType) {
|
||||||
|
case EbtDouble:
|
||||||
|
appendStr("d");
|
||||||
|
break;
|
||||||
|
case EbtInt:
|
||||||
|
appendStr("i");
|
||||||
|
break;
|
||||||
|
case EbtUint:
|
||||||
|
appendStr("u");
|
||||||
|
break;
|
||||||
|
case EbtBool:
|
||||||
|
appendStr("b");
|
||||||
|
break;
|
||||||
|
case EbtFloat:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (isVector()) {
|
||||||
|
appendStr("vec");
|
||||||
|
appendInt(vectorSize);
|
||||||
|
} else {
|
||||||
|
appendStr("mat");
|
||||||
|
appendInt(matrixCols);
|
||||||
|
appendStr("x");
|
||||||
|
appendInt(matrixRows);
|
||||||
|
}
|
||||||
|
} else if (isStruct() && structure) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(structName.c_str());
|
||||||
|
appendStr("{");
|
||||||
|
bool hasHiddenMember = true;
|
||||||
|
for (size_t i = 0; i < structure->size(); ++i) {
|
||||||
|
if (!(*structure)[i].type->hiddenMember()) {
|
||||||
|
if (!hasHiddenMember)
|
||||||
|
appendStr(", ");
|
||||||
|
typeString.append((*structure)[i].type->getCompleteString(syntactic, getQualifiers, getPrecision, getType, (*structure)[i].type->getFieldName()));
|
||||||
|
hasHiddenMember = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
appendStr("}");
|
||||||
|
} else {
|
||||||
|
appendStr(" ");
|
||||||
|
switch (basicType) {
|
||||||
|
case EbtDouble:
|
||||||
|
appendStr("double");
|
||||||
|
break;
|
||||||
|
case EbtInt:
|
||||||
|
appendStr("int");
|
||||||
|
break;
|
||||||
|
case EbtUint:
|
||||||
|
appendStr("uint");
|
||||||
|
break;
|
||||||
|
case EbtBool:
|
||||||
|
appendStr("bool");
|
||||||
|
break;
|
||||||
|
case EbtFloat:
|
||||||
|
appendStr("float");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appendStr("unexpected");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (name.length() > 0) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(name.c_str());
|
||||||
|
}
|
||||||
|
if (isArray()) {
|
||||||
|
for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
|
||||||
int size = arraySizes->getDimSize(i);
|
int size = arraySizes->getDimSize(i);
|
||||||
if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())
|
if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())
|
||||||
appendStr(" runtime-sized array of");
|
appendStr("[]");
|
||||||
else {
|
else {
|
||||||
if (size == UnsizedArraySize) {
|
if (size == UnsizedArraySize) {
|
||||||
appendStr(" unsized");
|
appendStr("[");
|
||||||
if (i == 0) {
|
if (i == 0)
|
||||||
appendStr(" ");
|
appendInt(arraySizes->getImplicitSize());
|
||||||
appendInt(arraySizes->getImplicitSize());
|
appendStr("]");
|
||||||
}
|
}
|
||||||
} else {
|
else {
|
||||||
appendStr(" ");
|
appendStr("[");
|
||||||
appendInt(arraySizes->getDimSize(i));
|
appendInt(arraySizes->getDimSize(i));
|
||||||
}
|
appendStr("]");
|
||||||
appendStr("-element array of");
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isParameterized()) {
|
else {
|
||||||
appendStr("<");
|
if (isArray()) {
|
||||||
for(int i = 0; i < (int)typeParameters->getNumDims(); ++i) {
|
for (int i = 0; i < (int)arraySizes->getNumDims(); ++i) {
|
||||||
|
int size = arraySizes->getDimSize(i);
|
||||||
|
if (size == UnsizedArraySize && i == 0 && arraySizes->isVariablyIndexed())
|
||||||
|
appendStr(" runtime-sized array of");
|
||||||
|
else {
|
||||||
|
if (size == UnsizedArraySize) {
|
||||||
|
appendStr(" unsized");
|
||||||
|
if (i == 0) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendInt(arraySizes->getImplicitSize());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appendStr(" ");
|
||||||
|
appendInt(arraySizes->getDimSize(i));
|
||||||
|
}
|
||||||
|
appendStr("-element array of");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isParameterized()) {
|
||||||
|
appendStr("<");
|
||||||
|
for (int i = 0; i < (int)typeParameters->getNumDims(); ++i) {
|
||||||
appendInt(typeParameters->getDimSize(i));
|
appendInt(typeParameters->getDimSize(i));
|
||||||
if (i != (int)typeParameters->getNumDims() - 1)
|
if (i != (int)typeParameters->getNumDims() - 1)
|
||||||
|
appendStr(", ");
|
||||||
|
}
|
||||||
|
appendStr(">");
|
||||||
|
}
|
||||||
|
if (getPrecision && qualifier.precision != EpqNone) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(getPrecisionQualifierString());
|
||||||
|
}
|
||||||
|
if (isMatrix()) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendInt(matrixCols);
|
||||||
|
appendStr("X");
|
||||||
|
appendInt(matrixRows);
|
||||||
|
appendStr(" matrix of");
|
||||||
|
}
|
||||||
|
else if (isVector()) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendInt(vectorSize);
|
||||||
|
appendStr("-component vector of");
|
||||||
|
}
|
||||||
|
|
||||||
|
appendStr(" ");
|
||||||
|
typeString.append(getBasicTypeString());
|
||||||
|
|
||||||
|
if (qualifier.builtIn != EbvNone) {
|
||||||
|
appendStr(" ");
|
||||||
|
appendStr(getBuiltInVariableString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add struct/block members
|
||||||
|
if (isStruct() && structure) {
|
||||||
|
appendStr("{");
|
||||||
|
bool hasHiddenMember = true;
|
||||||
|
for (size_t i = 0; i < structure->size(); ++i) {
|
||||||
|
if (!(*structure)[i].type->hiddenMember()) {
|
||||||
|
if (!hasHiddenMember)
|
||||||
appendStr(", ");
|
appendStr(", ");
|
||||||
}
|
typeString.append((*structure)[i].type->getCompleteString());
|
||||||
appendStr(">");
|
typeString.append(" ");
|
||||||
}
|
typeString.append((*structure)[i].type->getFieldName());
|
||||||
if (qualifier.precision != EpqNone) {
|
hasHiddenMember = false;
|
||||||
appendStr(" ");
|
|
||||||
appendStr(getPrecisionQualifierString());
|
|
||||||
}
|
|
||||||
if (isMatrix()) {
|
|
||||||
appendStr(" ");
|
|
||||||
appendInt(matrixCols);
|
|
||||||
appendStr("X");
|
|
||||||
appendInt(matrixRows);
|
|
||||||
appendStr(" matrix of");
|
|
||||||
} else if (isVector()) {
|
|
||||||
appendStr(" ");
|
|
||||||
appendInt(vectorSize);
|
|
||||||
appendStr("-component vector of");
|
|
||||||
}
|
|
||||||
|
|
||||||
appendStr(" ");
|
|
||||||
typeString.append(getBasicTypeString());
|
|
||||||
|
|
||||||
if (qualifier.builtIn != EbvNone) {
|
|
||||||
appendStr(" ");
|
|
||||||
appendStr(getBuiltInVariableString());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add struct/block members
|
|
||||||
if (isStruct() && structure) {
|
|
||||||
appendStr("{");
|
|
||||||
bool hasHiddenMember = true;
|
|
||||||
for (size_t i = 0; i < structure->size(); ++i) {
|
|
||||||
if (! (*structure)[i].type->hiddenMember()) {
|
|
||||||
if (!hasHiddenMember)
|
|
||||||
appendStr(", ");
|
|
||||||
typeString.append((*structure)[i].type->getCompleteString());
|
|
||||||
typeString.append(" ");
|
|
||||||
typeString.append((*structure)[i].type->getFieldName());
|
|
||||||
hasHiddenMember = false;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
appendStr("}");
|
||||||
}
|
}
|
||||||
appendStr("}");
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return typeString;
|
return typeString;
|
||||||
@@ -2442,13 +2548,27 @@ public:
|
|||||||
// type definitions, and member names to be considered the same type.
|
// type definitions, and member names to be considered the same type.
|
||||||
// This rule applies recursively for nested or embedded types."
|
// This rule applies recursively for nested or embedded types."
|
||||||
//
|
//
|
||||||
bool sameStructType(const TType& right) const
|
// If type mismatch in structure, return member indices through lpidx and rpidx.
|
||||||
|
// If matching members for either block are exhausted, return -1 for exhausted
|
||||||
|
// block and the index of the unmatched member. Otherwise return {-1,-1}.
|
||||||
|
//
|
||||||
|
bool sameStructType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const
|
||||||
{
|
{
|
||||||
|
// Initialize error to general type mismatch.
|
||||||
|
if (lpidx != nullptr) {
|
||||||
|
*lpidx = -1;
|
||||||
|
*rpidx = -1;
|
||||||
|
}
|
||||||
|
|
||||||
// Most commonly, they are both nullptr, or the same pointer to the same actual structure
|
// Most commonly, they are both nullptr, or the same pointer to the same actual structure
|
||||||
|
// TODO: Why return true when neither types are structures?
|
||||||
if ((!isStruct() && !right.isStruct()) ||
|
if ((!isStruct() && !right.isStruct()) ||
|
||||||
(isStruct() && right.isStruct() && structure == right.structure))
|
(isStruct() && right.isStruct() && structure == right.structure))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (!isStruct() || !right.isStruct())
|
||||||
|
return false;
|
||||||
|
|
||||||
// Structure names have to match
|
// Structure names have to match
|
||||||
if (*typeName != *right.typeName)
|
if (*typeName != *right.typeName)
|
||||||
return false;
|
return false;
|
||||||
@@ -2458,17 +2578,30 @@ public:
|
|||||||
bool isGLPerVertex = *typeName == "gl_PerVertex";
|
bool isGLPerVertex = *typeName == "gl_PerVertex";
|
||||||
|
|
||||||
// Both being nullptr was caught above, now they both have to be structures of the same number of elements
|
// Both being nullptr was caught above, now they both have to be structures of the same number of elements
|
||||||
if (!isStruct() || !right.isStruct() ||
|
if (lpidx == nullptr &&
|
||||||
(structure->size() != right.structure->size() && !isGLPerVertex))
|
(structure->size() != right.structure->size() && !isGLPerVertex)) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Compare the names and types of all the members, which have to match
|
// Compare the names and types of all the members, which have to match
|
||||||
for (size_t li = 0, ri = 0; li < structure->size() || ri < right.structure->size(); ++li, ++ri) {
|
for (size_t li = 0, ri = 0; li < structure->size() || ri < right.structure->size(); ++li, ++ri) {
|
||||||
|
if (lpidx != nullptr) {
|
||||||
|
*lpidx = static_cast<int>(li);
|
||||||
|
*rpidx = static_cast<int>(ri);
|
||||||
|
}
|
||||||
if (li < structure->size() && ri < right.structure->size()) {
|
if (li < structure->size() && ri < right.structure->size()) {
|
||||||
if ((*structure)[li].type->getFieldName() == (*right.structure)[ri].type->getFieldName()) {
|
if ((*structure)[li].type->getFieldName() == (*right.structure)[ri].type->getFieldName()) {
|
||||||
if (*(*structure)[li].type != *(*right.structure)[ri].type)
|
if (*(*structure)[li].type != *(*right.structure)[ri].type)
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
|
// Skip hidden members
|
||||||
|
if ((*structure)[li].type->hiddenMember()) {
|
||||||
|
ri--;
|
||||||
|
continue;
|
||||||
|
} else if ((*right.structure)[ri].type->hiddenMember()) {
|
||||||
|
li--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// If one of the members is something that's inconsistently declared, skip over it
|
// If one of the members is something that's inconsistently declared, skip over it
|
||||||
// for now.
|
// for now.
|
||||||
if (isGLPerVertex) {
|
if (isGLPerVertex) {
|
||||||
@@ -2485,11 +2618,19 @@ public:
|
|||||||
}
|
}
|
||||||
// If we get here, then there should only be inconsistently declared members left
|
// If we get here, then there should only be inconsistently declared members left
|
||||||
} else if (li < structure->size()) {
|
} else if (li < structure->size()) {
|
||||||
if (!isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName()))
|
if (!(*structure)[li].type->hiddenMember() && !isInconsistentGLPerVertexMember((*structure)[li].type->getFieldName())) {
|
||||||
|
if (lpidx != nullptr) {
|
||||||
|
*rpidx = -1;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName()))
|
if (!(*right.structure)[ri].type->hiddenMember() && !isInconsistentGLPerVertexMember((*right.structure)[ri].type->getFieldName())) {
|
||||||
|
if (lpidx != nullptr) {
|
||||||
|
*lpidx = -1;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2513,10 +2654,15 @@ public:
|
|||||||
return *referentType == *right.referentType;
|
return *referentType == *right.referentType;
|
||||||
}
|
}
|
||||||
|
|
||||||
// See if two types match, in all aspects except arrayness
|
// See if two types match, in all aspects except arrayness
|
||||||
bool sameElementType(const TType& right) const
|
// If mismatch in structure members, return member indices in lpidx and rpidx.
|
||||||
|
bool sameElementType(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const
|
||||||
{
|
{
|
||||||
return basicType == right.basicType && sameElementShape(right);
|
if (lpidx != nullptr) {
|
||||||
|
*lpidx = -1;
|
||||||
|
*rpidx = -1;
|
||||||
|
}
|
||||||
|
return basicType == right.basicType && sameElementShape(right, lpidx, rpidx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// See if two type's arrayness match
|
// See if two type's arrayness match
|
||||||
@@ -2550,15 +2696,20 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// See if two type's elements match in all ways except basic type
|
// See if two type's elements match in all ways except basic type
|
||||||
bool sameElementShape(const TType& right) const
|
// If mismatch in structure members, return member indices in lpidx and rpidx.
|
||||||
|
bool sameElementShape(const TType& right, int* lpidx = nullptr, int* rpidx = nullptr) const
|
||||||
{
|
{
|
||||||
return sampler == right.sampler &&
|
if (lpidx != nullptr) {
|
||||||
|
*lpidx = -1;
|
||||||
|
*rpidx = -1;
|
||||||
|
}
|
||||||
|
return ((basicType != EbtSampler && right.basicType != EbtSampler) || sampler == right.sampler) &&
|
||||||
vectorSize == right.vectorSize &&
|
vectorSize == right.vectorSize &&
|
||||||
matrixCols == right.matrixCols &&
|
matrixCols == right.matrixCols &&
|
||||||
matrixRows == right.matrixRows &&
|
matrixRows == right.matrixRows &&
|
||||||
vector1 == right.vector1 &&
|
vector1 == right.vector1 &&
|
||||||
isCoopMat() == right.isCoopMat() &&
|
isCoopMat() == right.isCoopMat() &&
|
||||||
sameStructType(right) &&
|
sameStructType(right, lpidx, rpidx) &&
|
||||||
sameReferenceType(right);
|
sameReferenceType(right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -224,6 +224,10 @@ GLSLANG_EXPORT void glslang_finalize_process();
|
|||||||
|
|
||||||
GLSLANG_EXPORT glslang_shader_t* glslang_shader_create(const glslang_input_t* input);
|
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_delete(glslang_shader_t* shader);
|
||||||
|
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
|
||||||
|
GLSLANG_EXPORT void glslang_shader_set_glsl_version(glslang_shader_t* shader, int version);
|
||||||
GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input);
|
GLSLANG_EXPORT int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input);
|
||||||
GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input);
|
GLSLANG_EXPORT int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input);
|
||||||
GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader);
|
GLSLANG_EXPORT const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader);
|
||||||
@@ -234,6 +238,7 @@ GLSLANG_EXPORT glslang_program_t* glslang_program_create();
|
|||||||
GLSLANG_EXPORT void glslang_program_delete(glslang_program_t* program);
|
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 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
|
GLSLANG_EXPORT int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t
|
||||||
|
GLSLANG_EXPORT int glslang_program_map_io(glslang_program_t* program);
|
||||||
GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage);
|
GLSLANG_EXPORT void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage);
|
||||||
GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program);
|
GLSLANG_EXPORT size_t glslang_program_SPIRV_get_size(glslang_program_t* program);
|
||||||
GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*);
|
GLSLANG_EXPORT void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*);
|
||||||
|
|||||||
@@ -101,8 +101,9 @@ typedef enum {
|
|||||||
GLSLANG_TARGET_VULKAN_1_0 = (1 << 22),
|
GLSLANG_TARGET_VULKAN_1_0 = (1 << 22),
|
||||||
GLSLANG_TARGET_VULKAN_1_1 = (1 << 22) | (1 << 12),
|
GLSLANG_TARGET_VULKAN_1_1 = (1 << 22) | (1 << 12),
|
||||||
GLSLANG_TARGET_VULKAN_1_2 = (1 << 22) | (2 << 12),
|
GLSLANG_TARGET_VULKAN_1_2 = (1 << 22) | (2 << 12),
|
||||||
|
GLSLANG_TARGET_VULKAN_1_3 = (1 << 22) | (3 << 12),
|
||||||
GLSLANG_TARGET_OPENGL_450 = 450,
|
GLSLANG_TARGET_OPENGL_450 = 450,
|
||||||
LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT = 4),
|
LAST_ELEMENT_MARKER(GLSLANG_TARGET_CLIENT_VERSION_COUNT = 5),
|
||||||
} glslang_target_client_version_t;
|
} glslang_target_client_version_t;
|
||||||
|
|
||||||
/* SH_TARGET_LanguageVersion counterpart */
|
/* SH_TARGET_LanguageVersion counterpart */
|
||||||
@@ -113,13 +114,16 @@ typedef enum {
|
|||||||
GLSLANG_TARGET_SPV_1_3 = (1 << 16) | (3 << 8),
|
GLSLANG_TARGET_SPV_1_3 = (1 << 16) | (3 << 8),
|
||||||
GLSLANG_TARGET_SPV_1_4 = (1 << 16) | (4 << 8),
|
GLSLANG_TARGET_SPV_1_4 = (1 << 16) | (4 << 8),
|
||||||
GLSLANG_TARGET_SPV_1_5 = (1 << 16) | (5 << 8),
|
GLSLANG_TARGET_SPV_1_5 = (1 << 16) | (5 << 8),
|
||||||
LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT = 6),
|
GLSLANG_TARGET_SPV_1_6 = (1 << 16) | (6 << 8),
|
||||||
|
LAST_ELEMENT_MARKER(GLSLANG_TARGET_LANGUAGE_VERSION_COUNT = 7),
|
||||||
} glslang_target_language_version_t;
|
} glslang_target_language_version_t;
|
||||||
|
|
||||||
/* EShExecutable counterpart */
|
/* EShExecutable counterpart */
|
||||||
typedef enum { GLSLANG_EX_VERTEX_FRAGMENT, GLSLANG_EX_FRAGMENT } glslang_executable_t;
|
typedef enum { GLSLANG_EX_VERTEX_FRAGMENT, GLSLANG_EX_FRAGMENT } glslang_executable_t;
|
||||||
|
|
||||||
/* EShOptimizationLevel counterpart */
|
// EShOptimizationLevel counterpart
|
||||||
|
// This enum is not used in the current C interface, but could be added at a later date.
|
||||||
|
// GLSLANG_OPT_NONE is the current default.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GLSLANG_OPT_NO_GENERATION,
|
GLSLANG_OPT_NO_GENERATION,
|
||||||
GLSLANG_OPT_NONE,
|
GLSLANG_OPT_NONE,
|
||||||
@@ -153,6 +157,7 @@ typedef enum {
|
|||||||
GLSLANG_MSG_HLSL_LEGALIZATION_BIT = (1 << 12),
|
GLSLANG_MSG_HLSL_LEGALIZATION_BIT = (1 << 12),
|
||||||
GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13),
|
GLSLANG_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13),
|
||||||
GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14),
|
GLSLANG_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14),
|
||||||
|
GLSLANG_MSG_ENHANCED = (1 << 15),
|
||||||
LAST_ELEMENT_MARKER(GLSLANG_MSG_COUNT),
|
LAST_ELEMENT_MARKER(GLSLANG_MSG_COUNT),
|
||||||
} glslang_messages_t;
|
} glslang_messages_t;
|
||||||
|
|
||||||
@@ -181,6 +186,26 @@ typedef enum {
|
|||||||
LAST_ELEMENT_MARKER(GLSLANG_PROFILE_COUNT),
|
LAST_ELEMENT_MARKER(GLSLANG_PROFILE_COUNT),
|
||||||
} glslang_profile_t;
|
} glslang_profile_t;
|
||||||
|
|
||||||
|
/* Shader options */
|
||||||
|
typedef enum {
|
||||||
|
GLSLANG_SHADER_DEFAULT_BIT = 0,
|
||||||
|
GLSLANG_SHADER_AUTO_MAP_BINDINGS = (1 << 0),
|
||||||
|
GLSLANG_SHADER_AUTO_MAP_LOCATIONS = (1 << 1),
|
||||||
|
GLSLANG_SHADER_VULKAN_RULES_RELAXED = (1 << 2),
|
||||||
|
LAST_ELEMENT_MARKER(GLSLANG_SHADER_COUNT),
|
||||||
|
} glslang_shader_options_t;
|
||||||
|
|
||||||
|
/* TResourceType counterpart */
|
||||||
|
typedef enum {
|
||||||
|
GLSLANG_RESOURCE_TYPE_SAMPLER,
|
||||||
|
GLSLANG_RESOURCE_TYPE_TEXTURE,
|
||||||
|
GLSLANG_RESOURCE_TYPE_IMAGE,
|
||||||
|
GLSLANG_RESOURCE_TYPE_UBO,
|
||||||
|
GLSLANG_RESOURCE_TYPE_SSBO,
|
||||||
|
GLSLANG_RESOURCE_TYPE_UAV,
|
||||||
|
LAST_ELEMENT_MARKER(GLSLANG_RESOURCE_TYPE_COUNT),
|
||||||
|
} glslang_resource_type_t;
|
||||||
|
|
||||||
#undef LAST_ELEMENT_MARKER
|
#undef LAST_ELEMENT_MARKER
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+1
-1
@@ -1155,7 +1155,7 @@ public:
|
|||||||
virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }
|
virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }
|
||||||
bool isAtomic() const { return type.isAtomic(); }
|
bool isAtomic() const { return type.isAtomic(); }
|
||||||
bool isReference() const { return type.isReference(); }
|
bool isReference() const { return type.isReference(); }
|
||||||
TString getCompleteString() const { return type.getCompleteString(); }
|
TString getCompleteString(bool enhanced = false) const { return type.getCompleteString(enhanced); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TIntermTyped& operator=(const TIntermTyped&);
|
TIntermTyped& operator=(const TIntermTyped&);
|
||||||
|
|||||||
+2
-31
@@ -46,35 +46,6 @@ namespace {
|
|||||||
|
|
||||||
using namespace glslang;
|
using namespace glslang;
|
||||||
|
|
||||||
typedef union {
|
|
||||||
double d;
|
|
||||||
int i[2];
|
|
||||||
} DoubleIntUnion;
|
|
||||||
|
|
||||||
// Some helper functions
|
|
||||||
|
|
||||||
bool isNan(double x)
|
|
||||||
{
|
|
||||||
DoubleIntUnion u;
|
|
||||||
// tough to find a platform independent library function, do it directly
|
|
||||||
u.d = x;
|
|
||||||
int bitPatternL = u.i[0];
|
|
||||||
int bitPatternH = u.i[1];
|
|
||||||
return (bitPatternH & 0x7ff80000) == 0x7ff80000 &&
|
|
||||||
((bitPatternH & 0xFFFFF) != 0 || bitPatternL != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isInf(double x)
|
|
||||||
{
|
|
||||||
DoubleIntUnion u;
|
|
||||||
// tough to find a platform independent library function, do it directly
|
|
||||||
u.d = x;
|
|
||||||
int bitPatternL = u.i[0];
|
|
||||||
int bitPatternH = u.i[1];
|
|
||||||
return (bitPatternH & 0x7ff00000) == 0x7ff00000 &&
|
|
||||||
(bitPatternH & 0xFFFFF) == 0 && bitPatternL == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const double pi = 3.1415926535897932384626433832795;
|
const double pi = 3.1415926535897932384626433832795;
|
||||||
|
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
@@ -663,12 +634,12 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType)
|
|||||||
|
|
||||||
case EOpIsNan:
|
case EOpIsNan:
|
||||||
{
|
{
|
||||||
newConstArray[i].setBConst(isNan(unionArray[i].getDConst()));
|
newConstArray[i].setBConst(IsNan(unionArray[i].getDConst()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EOpIsInf:
|
case EOpIsInf:
|
||||||
{
|
{
|
||||||
newConstArray[i].setBConst(isInf(unionArray[i].getDConst()));
|
newConstArray[i].setBConst(IsInfinity(unionArray[i].getDConst()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+47
-34
@@ -316,6 +316,7 @@ const CustomFunction CustomFunctions[] = {
|
|||||||
|
|
||||||
{ EOpTextureQuerySize, "textureSize", nullptr },
|
{ EOpTextureQuerySize, "textureSize", nullptr },
|
||||||
{ EOpTextureQueryLod, "textureQueryLod", nullptr },
|
{ EOpTextureQueryLod, "textureQueryLod", nullptr },
|
||||||
|
{ EOpTextureQueryLod, "textureQueryLOD", nullptr }, // extension GL_ARB_texture_query_lod
|
||||||
{ EOpTextureQueryLevels, "textureQueryLevels", nullptr },
|
{ EOpTextureQueryLevels, "textureQueryLevels", nullptr },
|
||||||
{ EOpTextureQuerySamples, "textureSamples", nullptr },
|
{ EOpTextureQuerySamples, "textureSamples", nullptr },
|
||||||
{ EOpTexture, "texture", nullptr },
|
{ EOpTexture, "texture", nullptr },
|
||||||
@@ -4269,7 +4270,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
|
|||||||
//
|
//
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
if (profile != EEsProfile && version >= 400) {
|
if (profile != EEsProfile && (version >= 400 || version == 150)) {
|
||||||
stageBuiltins[EShLangGeometry].append(
|
stageBuiltins[EShLangGeometry].append(
|
||||||
"void EmitStreamVertex(int);"
|
"void EmitStreamVertex(int);"
|
||||||
"void EndStreamPrimitive(int);"
|
"void EndStreamPrimitive(int);"
|
||||||
@@ -4553,11 +4554,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
|
|||||||
"\n");
|
"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// GL_ARB_shader_clock
|
// GL_ARB_shader_clock& GL_EXT_shader_realtime_clock
|
||||||
if (profile != EEsProfile && version >= 450) {
|
if (profile != EEsProfile && version >= 450) {
|
||||||
commonBuiltins.append(
|
commonBuiltins.append(
|
||||||
"uvec2 clock2x32ARB();"
|
"uvec2 clock2x32ARB();"
|
||||||
"uint64_t clockARB();"
|
"uint64_t clockARB();"
|
||||||
|
"uvec2 clockRealtime2x32EXT();"
|
||||||
|
"uint64_t clockRealtimeEXT();"
|
||||||
"\n");
|
"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6245,38 +6248,44 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int
|
|||||||
//
|
//
|
||||||
// textureQueryLod(), fragment stage only
|
// textureQueryLod(), fragment stage only
|
||||||
// Also enabled with extension GL_ARB_texture_query_lod
|
// Also enabled with extension GL_ARB_texture_query_lod
|
||||||
|
// Extension GL_ARB_texture_query_lod says that textureQueryLOD() also exist at extension.
|
||||||
|
|
||||||
if (profile != EEsProfile && version >= 150 && sampler.isCombined() && sampler.dim != EsdRect &&
|
if (profile != EEsProfile && version >= 150 && sampler.isCombined() && sampler.dim != EsdRect &&
|
||||||
! sampler.isMultiSample() && ! sampler.isBuffer()) {
|
! sampler.isMultiSample() && ! sampler.isBuffer()) {
|
||||||
for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {
|
|
||||||
if (f16TexAddr && sampler.type != EbtFloat16)
|
|
||||||
continue;
|
|
||||||
stageBuiltins[EShLangFragment].append("vec2 textureQueryLod(");
|
|
||||||
stageBuiltins[EShLangFragment].append(typeName);
|
|
||||||
if (dimMap[sampler.dim] == 1)
|
|
||||||
if (f16TexAddr)
|
|
||||||
stageBuiltins[EShLangFragment].append(", float16_t");
|
|
||||||
else
|
|
||||||
stageBuiltins[EShLangFragment].append(", float");
|
|
||||||
else {
|
|
||||||
if (f16TexAddr)
|
|
||||||
stageBuiltins[EShLangFragment].append(", f16vec");
|
|
||||||
else
|
|
||||||
stageBuiltins[EShLangFragment].append(", vec");
|
|
||||||
stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
|
|
||||||
}
|
|
||||||
stageBuiltins[EShLangFragment].append(");\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
stageBuiltins[EShLangCompute].append("vec2 textureQueryLod(");
|
const TString funcName[2] = {"vec2 textureQueryLod(", "vec2 textureQueryLOD("};
|
||||||
stageBuiltins[EShLangCompute].append(typeName);
|
|
||||||
if (dimMap[sampler.dim] == 1)
|
for (int i = 0; i < 2; ++i){
|
||||||
stageBuiltins[EShLangCompute].append(", float");
|
for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {
|
||||||
else {
|
if (f16TexAddr && sampler.type != EbtFloat16)
|
||||||
stageBuiltins[EShLangCompute].append(", vec");
|
continue;
|
||||||
stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]);
|
stageBuiltins[EShLangFragment].append(funcName[i]);
|
||||||
|
stageBuiltins[EShLangFragment].append(typeName);
|
||||||
|
if (dimMap[sampler.dim] == 1)
|
||||||
|
if (f16TexAddr)
|
||||||
|
stageBuiltins[EShLangFragment].append(", float16_t");
|
||||||
|
else
|
||||||
|
stageBuiltins[EShLangFragment].append(", float");
|
||||||
|
else {
|
||||||
|
if (f16TexAddr)
|
||||||
|
stageBuiltins[EShLangFragment].append(", f16vec");
|
||||||
|
else
|
||||||
|
stageBuiltins[EShLangFragment].append(", vec");
|
||||||
|
stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
|
||||||
|
}
|
||||||
|
stageBuiltins[EShLangFragment].append(");\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
stageBuiltins[EShLangCompute].append(funcName[i]);
|
||||||
|
stageBuiltins[EShLangCompute].append(typeName);
|
||||||
|
if (dimMap[sampler.dim] == 1)
|
||||||
|
stageBuiltins[EShLangCompute].append(", float");
|
||||||
|
else {
|
||||||
|
stageBuiltins[EShLangCompute].append(", vec");
|
||||||
|
stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]);
|
||||||
|
}
|
||||||
|
stageBuiltins[EShLangCompute].append(");\n");
|
||||||
}
|
}
|
||||||
stageBuiltins[EShLangCompute].append(");\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -8061,7 +8070,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (profile != EEsProfile && version < 400) {
|
if (profile != EEsProfile && version < 400) {
|
||||||
symbolTable.setFunctionExtensions("textureQueryLod", 1, &E_GL_ARB_texture_query_lod);
|
symbolTable.setFunctionExtensions("textureQueryLOD", 1, &E_GL_ARB_texture_query_lod);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (profile != EEsProfile && version >= 460) {
|
if (profile != EEsProfile && version >= 460) {
|
||||||
@@ -8324,6 +8333,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
|
|||||||
symbolTable.setFunctionExtensions("clockARB", 1, &E_GL_ARB_shader_clock);
|
symbolTable.setFunctionExtensions("clockARB", 1, &E_GL_ARB_shader_clock);
|
||||||
symbolTable.setFunctionExtensions("clock2x32ARB", 1, &E_GL_ARB_shader_clock);
|
symbolTable.setFunctionExtensions("clock2x32ARB", 1, &E_GL_ARB_shader_clock);
|
||||||
|
|
||||||
|
symbolTable.setFunctionExtensions("clockRealtimeEXT", 1, &E_GL_EXT_shader_realtime_clock);
|
||||||
|
symbolTable.setFunctionExtensions("clockRealtime2x32EXT", 1, &E_GL_EXT_shader_realtime_clock);
|
||||||
|
|
||||||
if (profile == EEsProfile && version < 320) {
|
if (profile == EEsProfile && version < 320) {
|
||||||
symbolTable.setVariableExtensions("gl_PrimitiveID", Num_AEP_geometry_shader, AEP_geometry_shader);
|
symbolTable.setVariableExtensions("gl_PrimitiveID", Num_AEP_geometry_shader, AEP_geometry_shader);
|
||||||
symbolTable.setVariableExtensions("gl_Layer", Num_AEP_geometry_shader, AEP_geometry_shader);
|
symbolTable.setVariableExtensions("gl_Layer", Num_AEP_geometry_shader, AEP_geometry_shader);
|
||||||
@@ -8341,10 +8353,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (profile != EEsProfile && version < 330 ) {
|
if (profile != EEsProfile && version < 330 ) {
|
||||||
symbolTable.setFunctionExtensions("floatBitsToInt", 1, &E_GL_ARB_shader_bit_encoding);
|
const char* bitsConvertExt[2] = {E_GL_ARB_shader_bit_encoding, E_GL_ARB_gpu_shader5};
|
||||||
symbolTable.setFunctionExtensions("floatBitsToUint", 1, &E_GL_ARB_shader_bit_encoding);
|
symbolTable.setFunctionExtensions("floatBitsToInt", 2, bitsConvertExt);
|
||||||
symbolTable.setFunctionExtensions("intBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
|
symbolTable.setFunctionExtensions("floatBitsToUint", 2, bitsConvertExt);
|
||||||
symbolTable.setFunctionExtensions("uintBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
|
symbolTable.setFunctionExtensions("intBitsToFloat", 2, bitsConvertExt);
|
||||||
|
symbolTable.setFunctionExtensions("uintBitsToFloat", 2, bitsConvertExt);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (profile != EEsProfile && version < 430 ) {
|
if (profile != EEsProfile && version < 430 ) {
|
||||||
|
|||||||
@@ -2766,7 +2766,7 @@ void TIntermBranch::updatePrecision(TPrecisionQualifier parentPrecision)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (exp->getBasicType() == EbtInt || exp->getBasicType() == EbtUint ||
|
if (exp->getBasicType() == EbtInt || exp->getBasicType() == EbtUint ||
|
||||||
exp->getBasicType() == EbtFloat || exp->getBasicType() == EbtFloat16) {
|
exp->getBasicType() == EbtFloat) {
|
||||||
if (parentPrecision != EpqNone && exp->getQualifier().precision == EpqNone) {
|
if (parentPrecision != EpqNone && exp->getQualifier().precision == EpqNone) {
|
||||||
exp->propagatePrecision(parentPrecision);
|
exp->propagatePrecision(parentPrecision);
|
||||||
}
|
}
|
||||||
@@ -3284,7 +3284,7 @@ bool TIntermediate::promoteUnary(TIntermUnary& node)
|
|||||||
void TIntermUnary::updatePrecision()
|
void TIntermUnary::updatePrecision()
|
||||||
{
|
{
|
||||||
if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
|
if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
|
||||||
getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
|
getBasicType() == EbtFloat) {
|
||||||
if (operand->getQualifier().precision > getQualifier().precision)
|
if (operand->getQualifier().precision > getQualifier().precision)
|
||||||
getQualifier().precision = operand->getQualifier().precision;
|
getQualifier().precision = operand->getQualifier().precision;
|
||||||
}
|
}
|
||||||
@@ -3785,7 +3785,7 @@ bool TIntermediate::promoteAggregate(TIntermAggregate& node)
|
|||||||
void TIntermAggregate::updatePrecision()
|
void TIntermAggregate::updatePrecision()
|
||||||
{
|
{
|
||||||
if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
|
if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
|
||||||
getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
|
getBasicType() == EbtFloat) {
|
||||||
TPrecisionQualifier maxPrecision = EpqNone;
|
TPrecisionQualifier maxPrecision = EpqNone;
|
||||||
TIntermSequence operands = getSequence();
|
TIntermSequence operands = getSequence();
|
||||||
for (unsigned int i = 0; i < operands.size(); ++i) {
|
for (unsigned int i = 0; i < operands.size(); ++i) {
|
||||||
@@ -3807,7 +3807,7 @@ void TIntermAggregate::updatePrecision()
|
|||||||
void TIntermBinary::updatePrecision()
|
void TIntermBinary::updatePrecision()
|
||||||
{
|
{
|
||||||
if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
|
if (getBasicType() == EbtInt || getBasicType() == EbtUint ||
|
||||||
getBasicType() == EbtFloat || getBasicType() == EbtFloat16) {
|
getBasicType() == EbtFloat) {
|
||||||
if (op == EOpRightShift || op == EOpLeftShift) {
|
if (op == EOpRightShift || op == EOpLeftShift) {
|
||||||
// For shifts get precision from left side only and thus no need to propagate
|
// For shifts get precision from left side only and thus no need to propagate
|
||||||
getQualifier().precision = left->getQualifier().precision;
|
getQualifier().precision = left->getQualifier().precision;
|
||||||
@@ -3902,7 +3902,7 @@ TIntermTyped* TIntermediate::promoteConstantUnion(TBasicType promoteTo, TIntermC
|
|||||||
case EbtFloat16: PROMOTE(setDConst, double, Get); break; \
|
case EbtFloat16: PROMOTE(setDConst, double, Get); break; \
|
||||||
case EbtFloat: PROMOTE(setDConst, double, Get); break; \
|
case EbtFloat: PROMOTE(setDConst, double, Get); break; \
|
||||||
case EbtDouble: PROMOTE(setDConst, double, Get); break; \
|
case EbtDouble: PROMOTE(setDConst, double, Get); break; \
|
||||||
case EbtInt8: PROMOTE(setI8Const, char, Get); break; \
|
case EbtInt8: PROMOTE(setI8Const, signed char, Get); break; \
|
||||||
case EbtInt16: PROMOTE(setI16Const, short, Get); break; \
|
case EbtInt16: PROMOTE(setI16Const, short, Get); break; \
|
||||||
case EbtInt: PROMOTE(setIConst, int, Get); break; \
|
case EbtInt: PROMOTE(setIConst, int, Get); break; \
|
||||||
case EbtInt64: PROMOTE(setI64Const, long long, Get); break; \
|
case EbtInt64: PROMOTE(setI64Const, long long, Get); break; \
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ void C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason
|
|||||||
{
|
{
|
||||||
if (messages & EShMsgOnlyPreprocessor)
|
if (messages & EShMsgOnlyPreprocessor)
|
||||||
return;
|
return;
|
||||||
|
// If enhanced msg readability, only print one error
|
||||||
|
if (messages & EShMsgEnhanced && numErrors > 0)
|
||||||
|
return;
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, szExtraInfoFormat);
|
va_start(args, szExtraInfoFormat);
|
||||||
outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args);
|
outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args);
|
||||||
|
|||||||
+104
-61
@@ -902,8 +902,10 @@ TIntermTyped* TParseContext::handleBinaryMath(const TSourceLoc& loc, const char*
|
|||||||
result = intermediate.addBinaryMath(op, left, right, loc);
|
result = intermediate.addBinaryMath(op, left, right, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == nullptr)
|
if (result == nullptr) {
|
||||||
binaryOpError(loc, str, left->getCompleteString(), right->getCompleteString());
|
bool enhanced = intermediate.getEnhancedMsgs();
|
||||||
|
binaryOpError(loc, str, left->getCompleteString(enhanced), right->getCompleteString(enhanced));
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -926,8 +928,10 @@ TIntermTyped* TParseContext::handleUnaryMath(const TSourceLoc& loc, const char*
|
|||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
else
|
else {
|
||||||
unaryOpError(loc, str, childNode->getCompleteString());
|
bool enhanced = intermediate.getEnhancedMsgs();
|
||||||
|
unaryOpError(loc, str, childNode->getCompleteString(enhanced));
|
||||||
|
}
|
||||||
|
|
||||||
return childNode;
|
return childNode;
|
||||||
}
|
}
|
||||||
@@ -953,8 +957,8 @@ TIntermTyped* TParseContext::handleDotDereference(const TSourceLoc& loc, TInterm
|
|||||||
requireProfile(loc, ~EEsProfile, feature);
|
requireProfile(loc, ~EEsProfile, feature);
|
||||||
profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, feature);
|
profileRequires(loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, feature);
|
||||||
} else if (!base->getType().isCoopMat()) {
|
} else if (!base->getType().isCoopMat()) {
|
||||||
error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString().c_str());
|
bool enhanced = intermediate.getEnhancedMsgs();
|
||||||
|
error(loc, "does not operate on this type:", field.c_str(), base->getType().getCompleteString(enhanced).c_str());
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1005,10 +1009,16 @@ TIntermTyped* TParseContext::handleDotDereference(const TSourceLoc& loc, TInterm
|
|||||||
intermediate.addIoAccessed(field);
|
intermediate.addIoAccessed(field);
|
||||||
}
|
}
|
||||||
inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier());
|
inheritMemoryQualifiers(base->getQualifier(), result->getWritableType().getQualifier());
|
||||||
} else
|
} else {
|
||||||
error(loc, "no such field in structure", field.c_str(), "");
|
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());
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
error(loc, "does not apply to this type:", field.c_str(), base->getType().getCompleteString().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
|
// Propagate noContraction up the dereference chain
|
||||||
if (base->getQualifier().isNoContraction())
|
if (base->getQualifier().isNoContraction())
|
||||||
@@ -1314,14 +1324,14 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction
|
|||||||
//
|
//
|
||||||
result = addConstructor(loc, arguments, type);
|
result = addConstructor(loc, arguments, type);
|
||||||
if (result == nullptr)
|
if (result == nullptr)
|
||||||
error(loc, "cannot construct with these arguments", type.getCompleteString().c_str(), "");
|
error(loc, "cannot construct with these arguments", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str(), "");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Find it in the symbol table.
|
// Find it in the symbol table.
|
||||||
//
|
//
|
||||||
const TFunction* fnCandidate;
|
const TFunction* fnCandidate;
|
||||||
bool builtIn;
|
bool builtIn {false};
|
||||||
fnCandidate = findFunction(loc, *function, builtIn);
|
fnCandidate = findFunction(loc, *function, builtIn);
|
||||||
if (fnCandidate) {
|
if (fnCandidate) {
|
||||||
// This is a declared function that might map to
|
// This is a declared function that might map to
|
||||||
@@ -1494,7 +1504,7 @@ TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNo
|
|||||||
else
|
else
|
||||||
error(arguments->getLoc(), " wrong operand type", "Internal Error",
|
error(arguments->getLoc(), " wrong operand type", "Internal Error",
|
||||||
"built in unary operator function. Type: %s",
|
"built in unary operator function. Type: %s",
|
||||||
static_cast<TIntermTyped*>(arguments)->getCompleteString().c_str());
|
static_cast<TIntermTyped*>(arguments)->getCompleteString(intermediate.getEnhancedMsgs()).c_str());
|
||||||
} else if (result->getAsOperator())
|
} else if (result->getAsOperator())
|
||||||
builtInOpCheck(loc, function, *result->getAsOperator());
|
builtInOpCheck(loc, function, *result->getAsOperator());
|
||||||
|
|
||||||
@@ -2495,6 +2505,8 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
|
|||||||
|
|
||||||
case EOpEmitStreamVertex:
|
case EOpEmitStreamVertex:
|
||||||
case EOpEndStreamPrimitive:
|
case EOpEndStreamPrimitive:
|
||||||
|
if (version == 150)
|
||||||
|
requireExtensions(loc, 1, &E_GL_ARB_gpu_shader5, "if the verison is 150 , the EmitStreamVertex and EndStreamPrimitive only support at extension GL_ARB_gpu_shader5");
|
||||||
intermediate.setMultiStream();
|
intermediate.setMultiStream();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2597,23 +2609,24 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
|
|||||||
// Check that if extended types are being used that the correct extensions are enabled.
|
// Check that if extended types are being used that the correct extensions are enabled.
|
||||||
if (arg0 != nullptr) {
|
if (arg0 != nullptr) {
|
||||||
const TType& type = arg0->getType();
|
const TType& type = arg0->getType();
|
||||||
|
bool enhanced = intermediate.getEnhancedMsgs();
|
||||||
switch (type.getBasicType()) {
|
switch (type.getBasicType()) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
case EbtInt8:
|
case EbtInt8:
|
||||||
case EbtUint8:
|
case EbtUint8:
|
||||||
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int8, type.getCompleteString().c_str());
|
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int8, type.getCompleteString(enhanced).c_str());
|
||||||
break;
|
break;
|
||||||
case EbtInt16:
|
case EbtInt16:
|
||||||
case EbtUint16:
|
case EbtUint16:
|
||||||
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int16, type.getCompleteString().c_str());
|
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int16, type.getCompleteString(enhanced).c_str());
|
||||||
break;
|
break;
|
||||||
case EbtInt64:
|
case EbtInt64:
|
||||||
case EbtUint64:
|
case EbtUint64:
|
||||||
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int64, type.getCompleteString().c_str());
|
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_int64, type.getCompleteString(enhanced).c_str());
|
||||||
break;
|
break;
|
||||||
case EbtFloat16:
|
case EbtFloat16:
|
||||||
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_float16, type.getCompleteString().c_str());
|
requireExtensions(loc, 1, &E_GL_EXT_shader_subgroup_extended_types_float16, type.getCompleteString(enhanced).c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2786,7 +2799,10 @@ TFunction* TParseContext::handleConstructorCall(const TSourceLoc& loc, const TPu
|
|||||||
TOperator op = intermediate.mapTypeToConstructorOp(type);
|
TOperator op = intermediate.mapTypeToConstructorOp(type);
|
||||||
|
|
||||||
if (op == EOpNull) {
|
if (op == EOpNull) {
|
||||||
error(loc, "cannot construct this type", type.getBasicString(), "");
|
if (intermediate.getEnhancedMsgs() && type.getBasicType() == EbtSampler)
|
||||||
|
error(loc, "function not supported in this version; use texture() instead", "texture*D*", "");
|
||||||
|
else
|
||||||
|
error(loc, "cannot construct this type", type.getBasicString(), "");
|
||||||
op = EOpConstructFloat;
|
op = EOpConstructFloat;
|
||||||
TType errorType(EbtFloat);
|
TType errorType(EbtFloat);
|
||||||
type.shallowCopy(errorType);
|
type.shallowCopy(errorType);
|
||||||
@@ -3196,6 +3212,12 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TString constructorString;
|
||||||
|
if (intermediate.getEnhancedMsgs())
|
||||||
|
constructorString.append(type.getCompleteString(true, false, false, true)).append(" constructor");
|
||||||
|
else
|
||||||
|
constructorString.append("constructor");
|
||||||
|
|
||||||
// See if it's a matrix
|
// See if it's a matrix
|
||||||
bool constructingMatrix = false;
|
bool constructingMatrix = false;
|
||||||
switch (op) {
|
switch (op) {
|
||||||
@@ -3253,7 +3275,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
if (function[arg].type->isArray()) {
|
if (function[arg].type->isArray()) {
|
||||||
if (function[arg].type->isUnsizedArray()) {
|
if (function[arg].type->isUnsizedArray()) {
|
||||||
// Can't construct from an unsized array.
|
// Can't construct from an unsized array.
|
||||||
error(loc, "array argument must be sized", "constructor", "");
|
error(loc, "array argument must be sized", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
arrayArg = true;
|
arrayArg = true;
|
||||||
@@ -3283,13 +3305,13 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
intArgument = true;
|
intArgument = true;
|
||||||
if (type.isStruct()) {
|
if (type.isStruct()) {
|
||||||
if (function[arg].type->contains16BitFloat()) {
|
if (function[arg].type->contains16BitFloat()) {
|
||||||
requireFloat16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type");
|
requireFloat16Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 16-bit type");
|
||||||
}
|
}
|
||||||
if (function[arg].type->contains16BitInt()) {
|
if (function[arg].type->contains16BitInt()) {
|
||||||
requireInt16Arithmetic(loc, "constructor", "can't construct structure containing 16-bit type");
|
requireInt16Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 16-bit type");
|
||||||
}
|
}
|
||||||
if (function[arg].type->contains8BitInt()) {
|
if (function[arg].type->contains8BitInt()) {
|
||||||
requireInt8Arithmetic(loc, "constructor", "can't construct structure containing 8-bit type");
|
requireInt8Arithmetic(loc, constructorString.c_str(), "can't construct structure containing 8-bit type");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3303,9 +3325,9 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
case EOpConstructF16Vec3:
|
case EOpConstructF16Vec3:
|
||||||
case EOpConstructF16Vec4:
|
case EOpConstructF16Vec4:
|
||||||
if (type.isArray())
|
if (type.isArray())
|
||||||
requireFloat16Arithmetic(loc, "constructor", "16-bit arrays not supported");
|
requireFloat16Arithmetic(loc, constructorString.c_str(), "16-bit arrays not supported");
|
||||||
if (type.isVector() && function.getParamCount() != 1)
|
if (type.isVector() && function.getParamCount() != 1)
|
||||||
requireFloat16Arithmetic(loc, "constructor", "16-bit vectors only take vector types");
|
requireFloat16Arithmetic(loc, constructorString.c_str(), "16-bit vectors only take vector types");
|
||||||
break;
|
break;
|
||||||
case EOpConstructUint16:
|
case EOpConstructUint16:
|
||||||
case EOpConstructU16Vec2:
|
case EOpConstructU16Vec2:
|
||||||
@@ -3316,9 +3338,9 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
case EOpConstructI16Vec3:
|
case EOpConstructI16Vec3:
|
||||||
case EOpConstructI16Vec4:
|
case EOpConstructI16Vec4:
|
||||||
if (type.isArray())
|
if (type.isArray())
|
||||||
requireInt16Arithmetic(loc, "constructor", "16-bit arrays not supported");
|
requireInt16Arithmetic(loc, constructorString.c_str(), "16-bit arrays not supported");
|
||||||
if (type.isVector() && function.getParamCount() != 1)
|
if (type.isVector() && function.getParamCount() != 1)
|
||||||
requireInt16Arithmetic(loc, "constructor", "16-bit vectors only take vector types");
|
requireInt16Arithmetic(loc, constructorString.c_str(), "16-bit vectors only take vector types");
|
||||||
break;
|
break;
|
||||||
case EOpConstructUint8:
|
case EOpConstructUint8:
|
||||||
case EOpConstructU8Vec2:
|
case EOpConstructU8Vec2:
|
||||||
@@ -3329,9 +3351,9 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
case EOpConstructI8Vec3:
|
case EOpConstructI8Vec3:
|
||||||
case EOpConstructI8Vec4:
|
case EOpConstructI8Vec4:
|
||||||
if (type.isArray())
|
if (type.isArray())
|
||||||
requireInt8Arithmetic(loc, "constructor", "8-bit arrays not supported");
|
requireInt8Arithmetic(loc, constructorString.c_str(), "8-bit arrays not supported");
|
||||||
if (type.isVector() && function.getParamCount() != 1)
|
if (type.isVector() && function.getParamCount() != 1)
|
||||||
requireInt8Arithmetic(loc, "constructor", "8-bit vectors only take vector types");
|
requireInt8Arithmetic(loc, constructorString.c_str(), "8-bit vectors only take vector types");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -3413,7 +3435,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
|
|
||||||
if (type.isArray()) {
|
if (type.isArray()) {
|
||||||
if (function.getParamCount() == 0) {
|
if (function.getParamCount() == 0) {
|
||||||
error(loc, "array constructor must have at least one argument", "constructor", "");
|
error(loc, "array constructor must have at least one argument", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3421,7 +3443,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
// auto adapt the constructor type to the number of arguments
|
// auto adapt the constructor type to the number of arguments
|
||||||
type.changeOuterArraySize(function.getParamCount());
|
type.changeOuterArraySize(function.getParamCount());
|
||||||
} else if (type.getOuterArraySize() != function.getParamCount()) {
|
} else if (type.getOuterArraySize() != function.getParamCount()) {
|
||||||
error(loc, "array constructor needs one argument per array element", "constructor", "");
|
error(loc, "array constructor needs one argument per array element", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3434,7 +3456,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
// At least the dimensionalities have to match.
|
// At least the dimensionalities have to match.
|
||||||
if (! function[0].type->isArray() ||
|
if (! function[0].type->isArray() ||
|
||||||
arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) {
|
arraySizes.getNumDims() != function[0].type->getArraySizes()->getNumDims() + 1) {
|
||||||
error(loc, "array constructor argument not correct type to construct array element", "constructor", "");
|
error(loc, "array constructor argument not correct type to construct array element", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3451,7 +3473,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (arrayArg && op != EOpConstructStruct && ! type.isArrayOfArrays()) {
|
if (arrayArg && op != EOpConstructStruct && ! type.isArrayOfArrays()) {
|
||||||
error(loc, "constructing non-array constituent from array argument", "constructor", "");
|
error(loc, "constructing non-array constituent from array argument", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3461,51 +3483,51 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T
|
|||||||
// "If a matrix argument is given to a matrix constructor,
|
// "If a matrix argument is given to a matrix constructor,
|
||||||
// it is a compile-time error to have any other arguments."
|
// it is a compile-time error to have any other arguments."
|
||||||
if (function.getParamCount() != 1)
|
if (function.getParamCount() != 1)
|
||||||
error(loc, "matrix constructed from matrix can only have one argument", "constructor", "");
|
error(loc, "matrix constructed from matrix can only have one argument", constructorString.c_str(), "");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overFull) {
|
if (overFull) {
|
||||||
error(loc, "too many arguments", "constructor", "");
|
error(loc, "too many arguments", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) {
|
if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) {
|
||||||
error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", "");
|
error(loc, "Number of constructor parameters does not match the number of structure fields", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((op != EOpConstructStruct && size != 1 && size < type.computeNumComponents()) ||
|
if ((op != EOpConstructStruct && size != 1 && size < type.computeNumComponents()) ||
|
||||||
(op == EOpConstructStruct && size < type.computeNumComponents())) {
|
(op == EOpConstructStruct && size < type.computeNumComponents())) {
|
||||||
error(loc, "not enough data provided for construction", "constructor", "");
|
error(loc, "not enough data provided for construction", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type.isCoopMat() && function.getParamCount() != 1) {
|
if (type.isCoopMat() && function.getParamCount() != 1) {
|
||||||
error(loc, "wrong number of arguments", "constructor", "");
|
error(loc, "wrong number of arguments", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (type.isCoopMat() &&
|
if (type.isCoopMat() &&
|
||||||
!(function[0].type->isScalar() || function[0].type->isCoopMat())) {
|
!(function[0].type->isScalar() || function[0].type->isCoopMat())) {
|
||||||
error(loc, "Cooperative matrix constructor argument must be scalar or cooperative matrix", "constructor", "");
|
error(loc, "Cooperative matrix constructor argument must be scalar or cooperative matrix", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
TIntermTyped* typed = node->getAsTyped();
|
TIntermTyped* typed = node->getAsTyped();
|
||||||
if (typed == nullptr) {
|
if (typed == nullptr) {
|
||||||
error(loc, "constructor argument does not have a type", "constructor", "");
|
error(loc, "constructor argument does not have a type", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (op != EOpConstructStruct && op != EOpConstructNonuniform && typed->getBasicType() == EbtSampler) {
|
if (op != EOpConstructStruct && op != EOpConstructNonuniform && typed->getBasicType() == EbtSampler) {
|
||||||
error(loc, "cannot convert a sampler", "constructor", "");
|
error(loc, "cannot convert a sampler", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (op != EOpConstructStruct && typed->isAtomic()) {
|
if (op != EOpConstructStruct && typed->isAtomic()) {
|
||||||
error(loc, "cannot convert an atomic_uint", "constructor", "");
|
error(loc, "cannot convert an atomic_uint", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (typed->getBasicType() == EbtVoid) {
|
if (typed->getBasicType() == EbtVoid) {
|
||||||
error(loc, "cannot convert a void", "constructor", "");
|
error(loc, "cannot convert a void", constructorString.c_str(), "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4589,7 +4611,7 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS
|
|||||||
|
|
||||||
if (ssoPre150 ||
|
if (ssoPre150 ||
|
||||||
(identifier == "gl_FragDepth" && ((nonEsRedecls && version >= 420) || esRedecls)) ||
|
(identifier == "gl_FragDepth" && ((nonEsRedecls && version >= 420) || esRedecls)) ||
|
||||||
(identifier == "gl_FragCoord" && ((nonEsRedecls && version >= 150) || esRedecls)) ||
|
(identifier == "gl_FragCoord" && ((nonEsRedecls && version >= 140) || esRedecls)) ||
|
||||||
identifier == "gl_ClipDistance" ||
|
identifier == "gl_ClipDistance" ||
|
||||||
identifier == "gl_CullDistance" ||
|
identifier == "gl_CullDistance" ||
|
||||||
identifier == "gl_ShadingRateEXT" ||
|
identifier == "gl_ShadingRateEXT" ||
|
||||||
@@ -4658,7 +4680,7 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS
|
|||||||
symbolQualifier.storage != qualifier.storage)
|
symbolQualifier.storage != qualifier.storage)
|
||||||
error(loc, "cannot change qualification of", "redeclaration", symbol->getName().c_str());
|
error(loc, "cannot change qualification of", "redeclaration", symbol->getName().c_str());
|
||||||
} else if (identifier == "gl_FragCoord") {
|
} else if (identifier == "gl_FragCoord") {
|
||||||
if (intermediate.inIoAccessed("gl_FragCoord"))
|
if (!intermediate.getTexCoordRedeclared() && intermediate.inIoAccessed("gl_FragCoord"))
|
||||||
error(loc, "cannot redeclare after use", "gl_FragCoord", "");
|
error(loc, "cannot redeclare after use", "gl_FragCoord", "");
|
||||||
if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat ||
|
if (qualifier.nopersp != symbolQualifier.nopersp || qualifier.flat != symbolQualifier.flat ||
|
||||||
qualifier.isMemory() || qualifier.isAuxiliary())
|
qualifier.isMemory() || qualifier.isAuxiliary())
|
||||||
@@ -4668,6 +4690,9 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS
|
|||||||
if (! builtIn && (publicType.pixelCenterInteger != intermediate.getPixelCenterInteger() ||
|
if (! builtIn && (publicType.pixelCenterInteger != intermediate.getPixelCenterInteger() ||
|
||||||
publicType.originUpperLeft != intermediate.getOriginUpperLeft()))
|
publicType.originUpperLeft != intermediate.getOriginUpperLeft()))
|
||||||
error(loc, "cannot redeclare with different qualification:", "redeclaration", symbol->getName().c_str());
|
error(loc, "cannot redeclare with different qualification:", "redeclaration", symbol->getName().c_str());
|
||||||
|
|
||||||
|
|
||||||
|
intermediate.setTexCoordRedeclared();
|
||||||
if (publicType.pixelCenterInteger)
|
if (publicType.pixelCenterInteger)
|
||||||
intermediate.setPixelCenterInteger();
|
intermediate.setPixelCenterInteger();
|
||||||
if (publicType.originUpperLeft)
|
if (publicType.originUpperLeft)
|
||||||
@@ -5499,12 +5524,19 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
|
|||||||
}
|
}
|
||||||
if (language == EShLangFragment) {
|
if (language == EShLangFragment) {
|
||||||
if (id == "origin_upper_left") {
|
if (id == "origin_upper_left") {
|
||||||
requireProfile(loc, ECoreProfile | ECompatibilityProfile, "origin_upper_left");
|
requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, "origin_upper_left");
|
||||||
|
if (profile == ENoProfile) {
|
||||||
|
profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, "origin_upper_left");
|
||||||
|
}
|
||||||
|
|
||||||
publicType.shaderQualifiers.originUpperLeft = true;
|
publicType.shaderQualifiers.originUpperLeft = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (id == "pixel_center_integer") {
|
if (id == "pixel_center_integer") {
|
||||||
requireProfile(loc, ECoreProfile | ECompatibilityProfile, "pixel_center_integer");
|
requireProfile(loc, ECoreProfile | ECompatibilityProfile | ENoProfile, "pixel_center_integer");
|
||||||
|
if (profile == ENoProfile) {
|
||||||
|
profileRequires(loc,ECoreProfile | ECompatibilityProfile, 140, E_GL_ARB_fragment_coord_conventions, "pixel_center_integer");
|
||||||
|
}
|
||||||
publicType.shaderQualifiers.pixelCenterInteger = true;
|
publicType.shaderQualifiers.pixelCenterInteger = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -6210,11 +6242,13 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
|
|||||||
|
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) {
|
if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) {
|
||||||
int repeated = intermediate.addXfbBufferOffset(type);
|
if (type.isUnsizedArray()) {
|
||||||
if (repeated >= 0)
|
|
||||||
error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer);
|
|
||||||
if (type.isUnsizedArray())
|
|
||||||
error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer);
|
error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer);
|
||||||
|
} else {
|
||||||
|
int repeated = intermediate.addXfbBufferOffset(type);
|
||||||
|
if (repeated >= 0)
|
||||||
|
error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
// "The offset must be a multiple of the size of the first component of the first
|
// "The offset must be a multiple of the size of the first component of the first
|
||||||
// qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate
|
// qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate
|
||||||
@@ -6334,8 +6368,12 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
|
|||||||
profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation);
|
profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qualifier.isPushConstant() && type.getBasicType() != EbtBlock)
|
if (qualifier.isPushConstant()) {
|
||||||
error(loc, "can only be used with a block", "push_constant", "");
|
if (type.getBasicType() != EbtBlock)
|
||||||
|
error(loc, "can only be used with a block", "push_constant", "");
|
||||||
|
if (type.isArray())
|
||||||
|
error(loc, "Push constants blocks can't be an array", "push_constant", "");
|
||||||
|
}
|
||||||
|
|
||||||
if (qualifier.hasBufferReference() && type.getBasicType() != EbtBlock)
|
if (qualifier.hasBufferReference() && type.getBasicType() != EbtBlock)
|
||||||
error(loc, "can only be used with a block", "buffer_reference", "");
|
error(loc, "can only be used with a block", "buffer_reference", "");
|
||||||
@@ -6496,6 +6534,8 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier
|
|||||||
error(loc, "can only be used with a uniform", "push_constant", "");
|
error(loc, "can only be used with a uniform", "push_constant", "");
|
||||||
if (qualifier.hasSet())
|
if (qualifier.hasSet())
|
||||||
error(loc, "cannot be used with push_constant", "set", "");
|
error(loc, "cannot be used with push_constant", "set", "");
|
||||||
|
if (qualifier.hasBinding())
|
||||||
|
error(loc, "cannot be used with push_constant", "binding", "");
|
||||||
}
|
}
|
||||||
if (qualifier.hasBufferReference()) {
|
if (qualifier.hasBufferReference()) {
|
||||||
if (qualifier.storage != EvqBuffer)
|
if (qualifier.storage != EvqBuffer)
|
||||||
@@ -6650,8 +6690,10 @@ const TFunction* TParseContext::findFunction(const TSourceLoc& loc, const TFunct
|
|||||||
: findFunctionExact(loc, call, builtIn));
|
: findFunctionExact(loc, call, builtIn));
|
||||||
else if (version < 120)
|
else if (version < 120)
|
||||||
function = findFunctionExact(loc, call, builtIn);
|
function = findFunctionExact(loc, call, builtIn);
|
||||||
else if (version < 400)
|
else if (version < 400) {
|
||||||
function = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn);
|
bool needfindFunction400 = extensionTurnedOn(E_GL_ARB_gpu_shader_fp64) || extensionTurnedOn(E_GL_ARB_gpu_shader5);
|
||||||
|
function = needfindFunction400 ? findFunction400(loc, call, builtIn) : findFunction120(loc, call, builtIn);
|
||||||
|
}
|
||||||
else if (explicitTypesEnabled)
|
else if (explicitTypesEnabled)
|
||||||
function = findFunctionExplicitTypes(loc, call, builtIn);
|
function = findFunctionExplicitTypes(loc, call, builtIn);
|
||||||
else
|
else
|
||||||
@@ -7422,14 +7464,14 @@ TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyp
|
|||||||
// Uniforms require a compile-time constant initializer
|
// Uniforms require a compile-time constant initializer
|
||||||
if (qualifier == EvqUniform && ! initializer->getType().getQualifier().isFrontEndConstant()) {
|
if (qualifier == EvqUniform && ! initializer->getType().getQualifier().isFrontEndConstant()) {
|
||||||
error(loc, "uniform initializers must be constant", "=", "'%s'",
|
error(loc, "uniform initializers must be constant", "=", "'%s'",
|
||||||
variable->getType().getCompleteString().c_str());
|
variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());
|
||||||
variable->getWritableType().getQualifier().makeTemporary();
|
variable->getWritableType().getQualifier().makeTemporary();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// Global consts require a constant initializer (specialization constant is okay)
|
// Global consts require a constant initializer (specialization constant is okay)
|
||||||
if (qualifier == EvqConst && symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) {
|
if (qualifier == EvqConst && symbolTable.atGlobalLevel() && ! initializer->getType().getQualifier().isConstant()) {
|
||||||
error(loc, "global const initializers must be constant", "=", "'%s'",
|
error(loc, "global const initializers must be constant", "=", "'%s'",
|
||||||
variable->getType().getCompleteString().c_str());
|
variable->getType().getCompleteString(intermediate.getEnhancedMsgs()).c_str());
|
||||||
variable->getWritableType().getQualifier().makeTemporary();
|
variable->getWritableType().getQualifier().makeTemporary();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -7492,7 +7534,7 @@ TIntermNode* TParseContext::executeInitializer(const TSourceLoc& loc, TIntermTyp
|
|||||||
TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc);
|
TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc);
|
||||||
TIntermTyped* initNode = intermediate.addAssign(EOpAssign, intermSymbol, initializer, loc);
|
TIntermTyped* initNode = intermediate.addAssign(EOpAssign, intermSymbol, initializer, loc);
|
||||||
if (! initNode)
|
if (! initNode)
|
||||||
assignError(loc, "=", intermSymbol->getCompleteString(), initializer->getCompleteString());
|
assignError(loc, "=", intermSymbol->getCompleteString(intermediate.getEnhancedMsgs()), initializer->getCompleteString(intermediate.getEnhancedMsgs()));
|
||||||
|
|
||||||
return initNode;
|
return initNode;
|
||||||
}
|
}
|
||||||
@@ -7563,7 +7605,7 @@ TIntermTyped* TParseContext::convertInitializerList(const TSourceLoc& loc, const
|
|||||||
}
|
}
|
||||||
} else if (type.isMatrix()) {
|
} else if (type.isMatrix()) {
|
||||||
if (type.getMatrixCols() != (int)initList->getSequence().size()) {
|
if (type.getMatrixCols() != (int)initList->getSequence().size()) {
|
||||||
error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
|
error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
TType vectorType(type, 0); // dereferenced type
|
TType vectorType(type, 0); // dereferenced type
|
||||||
@@ -7574,20 +7616,20 @@ TIntermTyped* TParseContext::convertInitializerList(const TSourceLoc& loc, const
|
|||||||
}
|
}
|
||||||
} else if (type.isVector()) {
|
} else if (type.isVector()) {
|
||||||
if (type.getVectorSize() != (int)initList->getSequence().size()) {
|
if (type.getVectorSize() != (int)initList->getSequence().size()) {
|
||||||
error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
|
error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
TBasicType destType = type.getBasicType();
|
TBasicType destType = type.getBasicType();
|
||||||
for (int i = 0; i < type.getVectorSize(); ++i) {
|
for (int i = 0; i < type.getVectorSize(); ++i) {
|
||||||
TBasicType initType = initList->getSequence()[i]->getAsTyped()->getBasicType();
|
TBasicType initType = initList->getSequence()[i]->getAsTyped()->getBasicType();
|
||||||
if (destType != initType && !intermediate.canImplicitlyPromote(initType, destType)) {
|
if (destType != initType && !intermediate.canImplicitlyPromote(initType, destType)) {
|
||||||
error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString().c_str());
|
error(loc, "type mismatch in initializer list", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString().c_str());
|
error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString(intermediate.getEnhancedMsgs()).c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8095,8 +8137,9 @@ TIntermTyped* TParseContext::constructAggregate(TIntermNode* node, const TType&
|
|||||||
{
|
{
|
||||||
TIntermTyped* converted = intermediate.addConversion(EOpConstructStruct, type, node->getAsTyped());
|
TIntermTyped* converted = intermediate.addConversion(EOpConstructStruct, type, node->getAsTyped());
|
||||||
if (! converted || converted->getType() != type) {
|
if (! converted || converted->getType() != type) {
|
||||||
|
bool enhanced = intermediate.getEnhancedMsgs();
|
||||||
error(loc, "", "constructor", "cannot convert parameter %d from '%s' to '%s'", paramCount,
|
error(loc, "", "constructor", "cannot convert parameter %d from '%s' to '%s'", paramCount,
|
||||||
node->getAsTyped()->getType().getCompleteString().c_str(), type.getCompleteString().c_str());
|
node->getAsTyped()->getType().getCompleteString(enhanced).c_str(), type.getCompleteString(enhanced).c_str());
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -813,6 +813,7 @@ bool ProcessDeferred(
|
|||||||
// set version/profile to defaultVersion/defaultProfile regardless of the #version
|
// set version/profile to defaultVersion/defaultProfile regardless of the #version
|
||||||
// directive in the source code
|
// directive in the source code
|
||||||
bool forceDefaultVersionAndProfile,
|
bool forceDefaultVersionAndProfile,
|
||||||
|
int overrideVersion, // overrides version specified by #verison or default version
|
||||||
bool forwardCompatible, // give errors for use of deprecated features
|
bool forwardCompatible, // give errors for use of deprecated features
|
||||||
EShMessages messages, // warnings/errors/AST; things to print out
|
EShMessages messages, // warnings/errors/AST; things to print out
|
||||||
TIntermediate& intermediate, // returned tree, etc.
|
TIntermediate& intermediate, // returned tree, etc.
|
||||||
@@ -900,6 +901,9 @@ bool ProcessDeferred(
|
|||||||
version = defaultVersion;
|
version = defaultVersion;
|
||||||
profile = defaultProfile;
|
profile = defaultProfile;
|
||||||
}
|
}
|
||||||
|
if (source == EShSourceGlsl && overrideVersion != 0) {
|
||||||
|
version = overrideVersion;
|
||||||
|
}
|
||||||
|
|
||||||
bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage,
|
bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage,
|
||||||
versionNotFirst, defaultVersion, source, version, profile, spvVersion);
|
versionNotFirst, defaultVersion, source, version, profile, spvVersion);
|
||||||
@@ -1275,6 +1279,7 @@ bool PreprocessDeferred(
|
|||||||
int defaultVersion, // use 100 for ES environment, 110 for desktop
|
int defaultVersion, // use 100 for ES environment, 110 for desktop
|
||||||
EProfile defaultProfile,
|
EProfile defaultProfile,
|
||||||
bool forceDefaultVersionAndProfile,
|
bool forceDefaultVersionAndProfile,
|
||||||
|
int overrideVersion, // use 0 if not overriding GLSL version
|
||||||
bool forwardCompatible, // give errors for use of deprecated features
|
bool forwardCompatible, // give errors for use of deprecated features
|
||||||
EShMessages messages, // warnings/errors/AST; things to print out
|
EShMessages messages, // warnings/errors/AST; things to print out
|
||||||
TShader::Includer& includer,
|
TShader::Includer& includer,
|
||||||
@@ -1285,7 +1290,7 @@ bool PreprocessDeferred(
|
|||||||
DoPreprocessing parser(outputString);
|
DoPreprocessing parser(outputString);
|
||||||
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
|
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
|
||||||
preamble, optLevel, resources, defaultVersion,
|
preamble, optLevel, resources, defaultVersion,
|
||||||
defaultProfile, forceDefaultVersionAndProfile,
|
defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
|
||||||
forwardCompatible, messages, intermediate, parser,
|
forwardCompatible, messages, intermediate, parser,
|
||||||
false, includer, "", environment);
|
false, includer, "", environment);
|
||||||
}
|
}
|
||||||
@@ -1314,6 +1319,7 @@ bool CompileDeferred(
|
|||||||
int defaultVersion, // use 100 for ES environment, 110 for desktop
|
int defaultVersion, // use 100 for ES environment, 110 for desktop
|
||||||
EProfile defaultProfile,
|
EProfile defaultProfile,
|
||||||
bool forceDefaultVersionAndProfile,
|
bool forceDefaultVersionAndProfile,
|
||||||
|
int overrideVersion, // use 0 if not overriding GLSL version
|
||||||
bool forwardCompatible, // give errors for use of deprecated features
|
bool forwardCompatible, // give errors for use of deprecated features
|
||||||
EShMessages messages, // warnings/errors/AST; things to print out
|
EShMessages messages, // warnings/errors/AST; things to print out
|
||||||
TIntermediate& intermediate,// returned tree, etc.
|
TIntermediate& intermediate,// returned tree, etc.
|
||||||
@@ -1324,7 +1330,7 @@ bool CompileDeferred(
|
|||||||
DoFullParse parser;
|
DoFullParse parser;
|
||||||
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
|
return ProcessDeferred(compiler, shaderStrings, numStrings, inputLengths, stringNames,
|
||||||
preamble, optLevel, resources, defaultVersion,
|
preamble, optLevel, resources, defaultVersion,
|
||||||
defaultProfile, forceDefaultVersionAndProfile,
|
defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
|
||||||
forwardCompatible, messages, intermediate, parser,
|
forwardCompatible, messages, intermediate, parser,
|
||||||
true, includer, sourceEntryPointName, environment);
|
true, includer, sourceEntryPointName, environment);
|
||||||
}
|
}
|
||||||
@@ -1343,7 +1349,6 @@ int ShInitialize()
|
|||||||
|
|
||||||
glslang::GetGlobalLock();
|
glslang::GetGlobalLock();
|
||||||
++NumberOfClients;
|
++NumberOfClients;
|
||||||
glslang::ReleaseGlobalLock();
|
|
||||||
|
|
||||||
if (PerProcessGPA == nullptr)
|
if (PerProcessGPA == nullptr)
|
||||||
PerProcessGPA = new TPoolAllocator();
|
PerProcessGPA = new TPoolAllocator();
|
||||||
@@ -1353,6 +1358,7 @@ int ShInitialize()
|
|||||||
glslang::HlslScanContext::fillInKeywordMap();
|
glslang::HlslScanContext::fillInKeywordMap();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
glslang::ReleaseGlobalLock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1415,9 +1421,10 @@ int ShFinalize()
|
|||||||
--NumberOfClients;
|
--NumberOfClients;
|
||||||
assert(NumberOfClients >= 0);
|
assert(NumberOfClients >= 0);
|
||||||
bool finalize = NumberOfClients == 0;
|
bool finalize = NumberOfClients == 0;
|
||||||
glslang::ReleaseGlobalLock();
|
if (! finalize) {
|
||||||
if (! finalize)
|
glslang::ReleaseGlobalLock();
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
for (int version = 0; version < VersionCount; ++version) {
|
for (int version = 0; version < VersionCount; ++version) {
|
||||||
for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {
|
for (int spvVersion = 0; spvVersion < SpvVersionCount; ++spvVersion) {
|
||||||
@@ -1455,6 +1462,7 @@ int ShFinalize()
|
|||||||
glslang::HlslScanContext::deleteKeywordMap();
|
glslang::HlslScanContext::deleteKeywordMap();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
glslang::ReleaseGlobalLock();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1496,7 +1504,7 @@ int ShCompile(
|
|||||||
TIntermediate intermediate(compiler->getLanguage());
|
TIntermediate intermediate(compiler->getLanguage());
|
||||||
TShader::ForbidIncluder includer;
|
TShader::ForbidIncluder includer;
|
||||||
bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, nullptr,
|
bool success = CompileDeferred(compiler, shaderStrings, numStrings, inputLengths, nullptr,
|
||||||
"", optLevel, resources, defaultVersion, ENoProfile, false,
|
"", optLevel, resources, defaultVersion, ENoProfile, false, 0,
|
||||||
forwardCompatible, messages, intermediate, includer);
|
forwardCompatible, messages, intermediate, includer);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1757,7 +1765,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
TShader::TShader(EShLanguage s)
|
TShader::TShader(EShLanguage s)
|
||||||
: stage(s), lengths(nullptr), stringNames(nullptr), preamble("")
|
: stage(s), lengths(nullptr), stringNames(nullptr), preamble(""), overrideVersion(0)
|
||||||
{
|
{
|
||||||
pool = new TPoolAllocator;
|
pool = new TPoolAllocator;
|
||||||
infoSink = new TInfoSink;
|
infoSink = new TInfoSink;
|
||||||
@@ -1826,7 +1834,14 @@ void TShader::setUniqueId(unsigned long long id)
|
|||||||
intermediate->setUniqueId(id);
|
intermediate->setUniqueId(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TShader::setOverrideVersion(int version)
|
||||||
|
{
|
||||||
|
overrideVersion = version;
|
||||||
|
}
|
||||||
|
|
||||||
void TShader::setInvertY(bool invert) { intermediate->setInvertY(invert); }
|
void TShader::setInvertY(bool invert) { intermediate->setInvertY(invert); }
|
||||||
|
void TShader::setDxPositionW(bool invert) { intermediate->setDxPositionW(invert); }
|
||||||
|
void TShader::setEnhancedMsgs() { intermediate->setEnhancedMsgs(); }
|
||||||
void TShader::setNanMinMaxClamp(bool useNonNan) { intermediate->setNanMinMaxClamp(useNonNan); }
|
void TShader::setNanMinMaxClamp(bool useNonNan) { intermediate->setNanMinMaxClamp(useNonNan); }
|
||||||
|
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
@@ -1906,7 +1921,7 @@ bool TShader::parse(const TBuiltInResource* builtInResources, int defaultVersion
|
|||||||
|
|
||||||
return CompileDeferred(compiler, strings, numStrings, lengths, stringNames,
|
return CompileDeferred(compiler, strings, numStrings, lengths, stringNames,
|
||||||
preamble, EShOptNone, builtInResources, defaultVersion,
|
preamble, EShOptNone, builtInResources, defaultVersion,
|
||||||
defaultProfile, forceDefaultVersionAndProfile,
|
defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
|
||||||
forwardCompatible, messages, *intermediate, includer, sourceEntryPointName,
|
forwardCompatible, messages, *intermediate, includer, sourceEntryPointName,
|
||||||
&environment);
|
&environment);
|
||||||
}
|
}
|
||||||
@@ -1933,7 +1948,7 @@ bool TShader::preprocess(const TBuiltInResource* builtInResources,
|
|||||||
|
|
||||||
return PreprocessDeferred(compiler, strings, numStrings, lengths, stringNames, preamble,
|
return PreprocessDeferred(compiler, strings, numStrings, lengths, stringNames, preamble,
|
||||||
EShOptNone, builtInResources, defaultVersion,
|
EShOptNone, builtInResources, defaultVersion,
|
||||||
defaultProfile, forceDefaultVersionAndProfile,
|
defaultProfile, forceDefaultVersionAndProfile, overrideVersion,
|
||||||
forwardCompatible, message, includer, *intermediate, output_string,
|
forwardCompatible, message, includer, *intermediate, output_string,
|
||||||
&environment);
|
&environment);
|
||||||
}
|
}
|
||||||
@@ -2046,6 +2061,8 @@ bool TProgram::linkStage(EShLanguage stage, EShMessages messages)
|
|||||||
firstIntermediate->getVersion(),
|
firstIntermediate->getVersion(),
|
||||||
firstIntermediate->getProfile());
|
firstIntermediate->getProfile());
|
||||||
intermediate[stage]->setLimits(firstIntermediate->getLimits());
|
intermediate[stage]->setLimits(firstIntermediate->getLimits());
|
||||||
|
if (firstIntermediate->getEnhancedMsgs())
|
||||||
|
intermediate[stage]->setEnhancedMsgs();
|
||||||
|
|
||||||
// The new TIntermediate must use the same origin as the original TIntermediates.
|
// The new TIntermediate must use the same origin as the original TIntermediates.
|
||||||
// Otherwise linking will fail due to different coordinate systems.
|
// Otherwise linking will fail due to different coordinate systems.
|
||||||
|
|||||||
@@ -426,12 +426,7 @@ TSymbolTableLevel* TSymbolTableLevel::clone() const
|
|||||||
symTableLevel->thisLevel = thisLevel;
|
symTableLevel->thisLevel = thisLevel;
|
||||||
symTableLevel->retargetedSymbols.clear();
|
symTableLevel->retargetedSymbols.clear();
|
||||||
for (auto &s : retargetedSymbols) {
|
for (auto &s : retargetedSymbols) {
|
||||||
// Extra constructions to make sure they use the correct allocator pool
|
symTableLevel->retargetedSymbols.push_back({s.first, s.second});
|
||||||
TString newFrom;
|
|
||||||
newFrom = s.first;
|
|
||||||
TString newTo;
|
|
||||||
newTo = s.second;
|
|
||||||
symTableLevel->retargetedSymbols.push_back({std::move(newFrom), std::move(newTo)});
|
|
||||||
}
|
}
|
||||||
std::vector<bool> containerCopied(anonId, false);
|
std::vector<bool> containerCopied(anonId, false);
|
||||||
tLevel::const_iterator iter;
|
tLevel::const_iterator iter;
|
||||||
@@ -462,11 +457,7 @@ TSymbolTableLevel* TSymbolTableLevel::clone() const
|
|||||||
TSymbol* sym = symTableLevel->find(s.second);
|
TSymbol* sym = symTableLevel->find(s.second);
|
||||||
if (!sym)
|
if (!sym)
|
||||||
continue;
|
continue;
|
||||||
|
symTableLevel->insert(s.first, sym);
|
||||||
// Need to declare and assign so newS is using the correct pool allocator
|
|
||||||
TString newS;
|
|
||||||
newS = s.first;
|
|
||||||
symTableLevel->insert(newS, sym);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return symTableLevel;
|
return symTableLevel;
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ typedef TVector<const char*> TExtensionList;
|
|||||||
class TSymbol {
|
class TSymbol {
|
||||||
public:
|
public:
|
||||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
||||||
explicit TSymbol(const TString *n) : name(n), extensions(0), writable(true) { }
|
explicit TSymbol(const TString *n) : name(n), uniqueId(0), extensions(0), writable(true) { }
|
||||||
virtual TSymbol* clone() const = 0;
|
virtual TSymbol* clone() const = 0;
|
||||||
virtual ~TSymbol() { } // rely on all symbol owned memory coming from the pool
|
virtual ~TSymbol() { } // rely on all symbol owned memory coming from the pool
|
||||||
|
|
||||||
|
|||||||
@@ -225,6 +225,9 @@ void TParseVersions::initializeExtensionBehavior()
|
|||||||
extensionBehavior[E_GL_ARB_shading_language_packing] = EBhDisable;
|
extensionBehavior[E_GL_ARB_shading_language_packing] = EBhDisable;
|
||||||
extensionBehavior[E_GL_ARB_texture_query_lod] = EBhDisable;
|
extensionBehavior[E_GL_ARB_texture_query_lod] = EBhDisable;
|
||||||
extensionBehavior[E_GL_ARB_vertex_attrib_64bit] = EBhDisable;
|
extensionBehavior[E_GL_ARB_vertex_attrib_64bit] = EBhDisable;
|
||||||
|
extensionBehavior[E_GL_ARB_draw_instanced] = EBhDisable;
|
||||||
|
extensionBehavior[E_GL_ARB_fragment_coord_conventions] = EBhDisable;
|
||||||
|
|
||||||
|
|
||||||
extensionBehavior[E_GL_KHR_shader_subgroup_basic] = EBhDisable;
|
extensionBehavior[E_GL_KHR_shader_subgroup_basic] = EBhDisable;
|
||||||
extensionBehavior[E_GL_KHR_shader_subgroup_vote] = EBhDisable;
|
extensionBehavior[E_GL_KHR_shader_subgroup_vote] = EBhDisable;
|
||||||
@@ -465,6 +468,8 @@ void TParseVersions::getPreamble(std::string& preamble)
|
|||||||
"#define GL_ARB_shader_storage_buffer_object 1\n"
|
"#define GL_ARB_shader_storage_buffer_object 1\n"
|
||||||
"#define GL_ARB_texture_query_lod 1\n"
|
"#define GL_ARB_texture_query_lod 1\n"
|
||||||
"#define GL_ARB_vertex_attrib_64bit 1\n"
|
"#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_EXT_shader_non_constant_global_initializers 1\n"
|
"#define GL_EXT_shader_non_constant_global_initializers 1\n"
|
||||||
"#define GL_EXT_shader_image_load_formatted 1\n"
|
"#define GL_EXT_shader_image_load_formatted 1\n"
|
||||||
"#define GL_EXT_post_depth_coverage 1\n"
|
"#define GL_EXT_post_depth_coverage 1\n"
|
||||||
|
|||||||
@@ -161,6 +161,8 @@ const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage
|
|||||||
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
||||||
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
||||||
const char* const E_GL_ARB_vertex_attrib_64bit = "GL_ARB_vertex_attrib_64bit";
|
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_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic";
|
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";
|
const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ conditional_expression
|
|||||||
parseContext.rValueErrorCheck($5.loc, ":", $6);
|
parseContext.rValueErrorCheck($5.loc, ":", $6);
|
||||||
$$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc);
|
$$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc);
|
||||||
if ($$ == 0) {
|
if ($$ == 0) {
|
||||||
parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(), $6->getCompleteString());
|
parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $6->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
$$ = $6;
|
$$ = $6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -815,7 +815,7 @@ assignment_expression
|
|||||||
parseContext.rValueErrorCheck($2.loc, "assign", $3);
|
parseContext.rValueErrorCheck($2.loc, "assign", $3);
|
||||||
$$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
|
$$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
|
||||||
if ($$ == 0) {
|
if ($$ == 0) {
|
||||||
parseContext.assignError($2.loc, "assign", $1->getCompleteString(), $3->getCompleteString());
|
parseContext.assignError($2.loc, "assign", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -877,7 +877,7 @@ expression
|
|||||||
parseContext.samplerConstructorLocationCheck($2.loc, ",", $3);
|
parseContext.samplerConstructorLocationCheck($2.loc, ",", $3);
|
||||||
$$ = parseContext.intermediate.addComma($1, $3, $2.loc);
|
$$ = parseContext.intermediate.addComma($1, $3, $2.loc);
|
||||||
if ($$ == 0) {
|
if ($$ == 0) {
|
||||||
parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(), $3->getCompleteString());
|
parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -798,7 +798,7 @@ conditional_expression
|
|||||||
parseContext.rValueErrorCheck($5.loc, ":", $6);
|
parseContext.rValueErrorCheck($5.loc, ":", $6);
|
||||||
$$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc);
|
$$ = parseContext.intermediate.addSelection($1, $4, $6, $2.loc);
|
||||||
if ($$ == 0) {
|
if ($$ == 0) {
|
||||||
parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(), $6->getCompleteString());
|
parseContext.binaryOpError($2.loc, ":", $4->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $6->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
$$ = $6;
|
$$ = $6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -815,7 +815,7 @@ assignment_expression
|
|||||||
parseContext.rValueErrorCheck($2.loc, "assign", $3);
|
parseContext.rValueErrorCheck($2.loc, "assign", $3);
|
||||||
$$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
|
$$ = parseContext.addAssign($2.loc, $2.op, $1, $3);
|
||||||
if ($$ == 0) {
|
if ($$ == 0) {
|
||||||
parseContext.assignError($2.loc, "assign", $1->getCompleteString(), $3->getCompleteString());
|
parseContext.assignError($2.loc, "assign", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -877,7 +877,7 @@ expression
|
|||||||
parseContext.samplerConstructorLocationCheck($2.loc, ",", $3);
|
parseContext.samplerConstructorLocationCheck($2.loc, ",", $3);
|
||||||
$$ = parseContext.intermediate.addComma($1, $3, $2.loc);
|
$$ = parseContext.intermediate.addComma($1, $3, $2.loc);
|
||||||
if ($$ == 0) {
|
if ($$ == 0) {
|
||||||
parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(), $3->getCompleteString());
|
parseContext.binaryOpError($2.loc, ",", $1->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), $3->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5878,7 +5878,7 @@ yyreduce:
|
|||||||
parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, ":", (yyvsp[0].interm.intermTypedNode));
|
parseContext.rValueErrorCheck((yyvsp[-1].lex).loc, ":", (yyvsp[0].interm.intermTypedNode));
|
||||||
(yyval.interm.intermTypedNode) = parseContext.intermediate.addSelection((yyvsp[-5].interm.intermTypedNode), (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-4].lex).loc);
|
(yyval.interm.intermTypedNode) = parseContext.intermediate.addSelection((yyvsp[-5].interm.intermTypedNode), (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-4].lex).loc);
|
||||||
if ((yyval.interm.intermTypedNode) == 0) {
|
if ((yyval.interm.intermTypedNode) == 0) {
|
||||||
parseContext.binaryOpError((yyvsp[-4].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
|
parseContext.binaryOpError((yyvsp[-4].lex).loc, ":", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
|
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5902,7 +5902,7 @@ yyreduce:
|
|||||||
parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode));
|
parseContext.rValueErrorCheck((yyvsp[-1].interm).loc, "assign", (yyvsp[0].interm.intermTypedNode));
|
||||||
(yyval.interm.intermTypedNode) = parseContext.addAssign((yyvsp[-1].interm).loc, (yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
|
(yyval.interm.intermTypedNode) = parseContext.addAssign((yyvsp[-1].interm).loc, (yyvsp[-1].interm).op, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
|
||||||
if ((yyval.interm.intermTypedNode) == 0) {
|
if ((yyval.interm.intermTypedNode) == 0) {
|
||||||
parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
|
parseContext.assignError((yyvsp[-1].interm).loc, "assign", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
|
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6023,7 +6023,7 @@ yyreduce:
|
|||||||
parseContext.samplerConstructorLocationCheck((yyvsp[-1].lex).loc, ",", (yyvsp[0].interm.intermTypedNode));
|
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);
|
(yyval.interm.intermTypedNode) = parseContext.intermediate.addComma((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
|
||||||
if ((yyval.interm.intermTypedNode) == 0) {
|
if ((yyval.interm.intermTypedNode) == 0) {
|
||||||
parseContext.binaryOpError((yyvsp[-1].lex).loc, ",", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
|
parseContext.binaryOpError((yyvsp[-1].lex).loc, ",", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()), (yyvsp[0].interm.intermTypedNode)->getCompleteString(parseContext.intermediate.getEnhancedMsgs()));
|
||||||
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
|
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,37 +48,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
bool IsInfinity(double x) {
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
switch (_fpclass(x)) {
|
|
||||||
case _FPCLASS_NINF:
|
|
||||||
case _FPCLASS_PINF:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return std::isinf(x);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsNan(double x) {
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
switch (_fpclass(x)) {
|
|
||||||
case _FPCLASS_SNAN:
|
|
||||||
case _FPCLASS_QNAN:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return std::isnan(x);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace glslang {
|
namespace glslang {
|
||||||
|
|
||||||
|
|||||||
+39
-20
@@ -203,11 +203,7 @@ struct TResolverUniformAdaptor {
|
|||||||
|
|
||||||
inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {
|
inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey) {
|
||||||
TVarEntryInfo& ent = entKey.second;
|
TVarEntryInfo& ent = entKey.second;
|
||||||
ent.newLocation = -1;
|
ent.clearNewAssignments();
|
||||||
ent.newComponent = -1;
|
|
||||||
ent.newBinding = -1;
|
|
||||||
ent.newSet = -1;
|
|
||||||
ent.newIndex = -1;
|
|
||||||
const bool isValid = resolver.validateBinding(stage, ent);
|
const bool isValid = resolver.validateBinding(stage, ent);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
resolver.resolveSet(ent.stage, ent);
|
resolver.resolveSet(ent.stage, ent);
|
||||||
@@ -281,11 +277,7 @@ struct TResolverInOutAdaptor {
|
|||||||
inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)
|
inline void operator()(std::pair<const TString, TVarEntryInfo>& entKey)
|
||||||
{
|
{
|
||||||
TVarEntryInfo& ent = entKey.second;
|
TVarEntryInfo& ent = entKey.second;
|
||||||
ent.newLocation = -1;
|
ent.clearNewAssignments();
|
||||||
ent.newComponent = -1;
|
|
||||||
ent.newBinding = -1;
|
|
||||||
ent.newSet = -1;
|
|
||||||
ent.newIndex = -1;
|
|
||||||
const bool isValid = resolver.validateInOut(ent.stage, ent);
|
const bool isValid = resolver.validateInOut(ent.stage, ent);
|
||||||
if (isValid) {
|
if (isValid) {
|
||||||
resolver.resolveInOutLocation(stage, ent);
|
resolver.resolveInOutLocation(stage, ent);
|
||||||
@@ -514,6 +506,24 @@ struct TSymbolValidater
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// Deal with input/output pairs where one is a block member but the other is loose,
|
||||||
|
// e.g. with ARB_separate_shader_objects
|
||||||
|
if (type1.getBasicType() == EbtBlock &&
|
||||||
|
type1.isStruct() && !type2.isStruct()) {
|
||||||
|
// Iterate through block members tracking layout
|
||||||
|
glslang::TString name;
|
||||||
|
type1.getStruct()->begin()->type->appendMangledName(name);
|
||||||
|
if (name == mangleName2
|
||||||
|
&& type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return;
|
||||||
|
}
|
||||||
|
if (type2.getBasicType() == EbtBlock &&
|
||||||
|
type2.isStruct() && !type1.isStruct()) {
|
||||||
|
// Iterate through block members tracking layout
|
||||||
|
glslang::TString name;
|
||||||
|
type2.getStruct()->begin()->type->appendMangledName(name);
|
||||||
|
if (name == mangleName1
|
||||||
|
&& type1.getQualifier().layoutLocation == type2.getQualifier().layoutLocation) return;
|
||||||
|
}
|
||||||
TString err = "Invalid In/Out variable type : " + entKey.first;
|
TString err = "Invalid In/Out variable type : " + entKey.first;
|
||||||
infoSink.info.message(EPrefixInternalError, err.c_str());
|
infoSink.info.message(EPrefixInternalError, err.c_str());
|
||||||
hadError = true;
|
hadError = true;
|
||||||
@@ -827,7 +837,7 @@ int TDefaultIoResolverBase::resolveUniformLocation(EShLanguage /*stage*/, TVarEn
|
|||||||
}
|
}
|
||||||
// no locations added if already present, a built-in variable, a block, or an opaque
|
// no locations added if already present, a built-in variable, a block, or an opaque
|
||||||
if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock ||
|
if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock ||
|
||||||
type.isAtomic() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
|
type.isAtomic() || type.isSpirvType() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
|
||||||
return ent.newLocation = -1;
|
return ent.newLocation = -1;
|
||||||
}
|
}
|
||||||
// no locations on blocks of built-in variables
|
// no locations on blocks of built-in variables
|
||||||
@@ -855,8 +865,8 @@ int TDefaultIoResolverBase::resolveInOutLocation(EShLanguage stage, TVarEntryInf
|
|||||||
return ent.newLocation = -1;
|
return ent.newLocation = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// no locations added if already present, or a built-in variable
|
// no locations added if already present, a built-in variable, or a variable with SPIR-V decorate
|
||||||
if (type.getQualifier().hasLocation() || type.isBuiltIn()) {
|
if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getQualifier().hasSprivDecorate()) {
|
||||||
return ent.newLocation = -1;
|
return ent.newLocation = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -942,8 +952,8 @@ int TDefaultGlslIoResolver::resolveInOutLocation(EShLanguage stage, TVarEntryInf
|
|||||||
if (type.getQualifier().hasLocation()) {
|
if (type.getQualifier().hasLocation()) {
|
||||||
return ent.newLocation = type.getQualifier().layoutLocation;
|
return ent.newLocation = type.getQualifier().layoutLocation;
|
||||||
}
|
}
|
||||||
// no locations added if already present, or a built-in variable
|
// no locations added if already present, a built-in variable, or a variable with SPIR-V decorate
|
||||||
if (type.isBuiltIn()) {
|
if (type.isBuiltIn() || type.getQualifier().hasSprivDecorate()) {
|
||||||
return ent.newLocation = -1;
|
return ent.newLocation = -1;
|
||||||
}
|
}
|
||||||
// no locations on blocks of built-in variables
|
// no locations on blocks of built-in variables
|
||||||
@@ -1024,7 +1034,8 @@ int TDefaultGlslIoResolver::resolveUniformLocation(EShLanguage /*stage*/, TVarEn
|
|||||||
} else {
|
} else {
|
||||||
// no locations added if already present, a built-in variable, a block, or an opaque
|
// no locations added if already present, a built-in variable, a block, or an opaque
|
||||||
if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock ||
|
if (type.getQualifier().hasLocation() || type.isBuiltIn() || type.getBasicType() == EbtBlock ||
|
||||||
type.isAtomic() || (type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
|
type.isAtomic() || type.isSpirvType() ||
|
||||||
|
(type.containsOpaque() && referenceIntermediate.getSpv().openGl == 0)) {
|
||||||
return ent.newLocation = -1;
|
return ent.newLocation = -1;
|
||||||
}
|
}
|
||||||
// no locations on blocks of built-in variables
|
// no locations on blocks of built-in variables
|
||||||
@@ -1651,6 +1662,10 @@ bool TGlslIoMapper::doMap(TIoMapResolver* resolver, TInfoSink& infoSink) {
|
|||||||
if (size <= int(autoPushConstantMaxSize)) {
|
if (size <= int(autoPushConstantMaxSize)) {
|
||||||
qualifier.setBlockStorage(EbsPushConstant);
|
qualifier.setBlockStorage(EbsPushConstant);
|
||||||
qualifier.layoutPacking = autoPushConstantBlockPacking;
|
qualifier.layoutPacking = autoPushConstantBlockPacking;
|
||||||
|
// Push constants don't have set/binding etc. decorations, remove those.
|
||||||
|
qualifier.layoutSet = TQualifier::layoutSetEnd;
|
||||||
|
at->second.clearNewAssignments();
|
||||||
|
|
||||||
upgraded = true;
|
upgraded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1658,10 +1673,14 @@ 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 remove it from the uniformVector
|
||||||
// so it doesn't get a set/binding assigned to it.
|
// so it doesn't get a set/binding assigned to it.
|
||||||
if (upgraded) {
|
if (upgraded) {
|
||||||
auto at = std::find_if(uniformVector.begin(), uniformVector.end(),
|
while (1) {
|
||||||
[this](const TVarLivePair& p) { return p.first == autoPushConstantBlockName; });
|
auto at = std::find_if(uniformVector.begin(), uniformVector.end(),
|
||||||
if (at != uniformVector.end())
|
[this](const TVarLivePair& p) { return p.first == autoPushConstantBlockName; });
|
||||||
uniformVector.erase(at);
|
if (at != uniformVector.end())
|
||||||
|
uniformVector.erase(at);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (size_t stage = 0; stage < EShLangCount; stage++) {
|
for (size_t stage = 0; stage < EShLangCount; stage++) {
|
||||||
|
|||||||
@@ -61,6 +61,15 @@ struct TVarEntryInfo {
|
|||||||
int newComponent;
|
int newComponent;
|
||||||
int newIndex;
|
int newIndex;
|
||||||
EShLanguage stage;
|
EShLanguage stage;
|
||||||
|
|
||||||
|
void clearNewAssignments() {
|
||||||
|
newBinding = -1;
|
||||||
|
newSet = -1;
|
||||||
|
newLocation = -1;
|
||||||
|
newComponent = -1;
|
||||||
|
newIndex = -1;
|
||||||
|
}
|
||||||
|
|
||||||
struct TOrderById {
|
struct TOrderById {
|
||||||
inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) { return l.id < r.id; }
|
inline bool operator()(const TVarEntryInfo& l, const TVarEntryInfo& r) { return l.id < r.id; }
|
||||||
};
|
};
|
||||||
|
|||||||
+262
-88
@@ -55,22 +55,28 @@ namespace glslang {
|
|||||||
//
|
//
|
||||||
// Link-time error emitter.
|
// Link-time error emitter.
|
||||||
//
|
//
|
||||||
void TIntermediate::error(TInfoSink& infoSink, const char* message)
|
void TIntermediate::error(TInfoSink& infoSink, const char* message, EShLanguage unitStage)
|
||||||
{
|
{
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
infoSink.info.prefix(EPrefixError);
|
infoSink.info.prefix(EPrefixError);
|
||||||
infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
|
if (unitStage < EShLangCount)
|
||||||
|
infoSink.info << "Linking " << StageName(getStage()) << " and " << StageName(unitStage) << " stages: " << message << "\n";
|
||||||
|
else
|
||||||
|
infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
++numErrors;
|
++numErrors;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link-time warning.
|
// Link-time warning.
|
||||||
void TIntermediate::warn(TInfoSink& infoSink, const char* message)
|
void TIntermediate::warn(TInfoSink& infoSink, const char* message, EShLanguage unitStage)
|
||||||
{
|
{
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
infoSink.info.prefix(EPrefixWarning);
|
infoSink.info.prefix(EPrefixWarning);
|
||||||
infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
|
if (unitStage < EShLangCount)
|
||||||
|
infoSink.info << "Linking " << StageName(language) << " and " << StageName(unitStage) << " stages: " << message << "\n";
|
||||||
|
else
|
||||||
|
infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,6 +318,7 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit)
|
|||||||
MERGE_TRUE(autoMapBindings);
|
MERGE_TRUE(autoMapBindings);
|
||||||
MERGE_TRUE(autoMapLocations);
|
MERGE_TRUE(autoMapLocations);
|
||||||
MERGE_TRUE(invertY);
|
MERGE_TRUE(invertY);
|
||||||
|
MERGE_TRUE(dxPositionW);
|
||||||
MERGE_TRUE(flattenUniformArrays);
|
MERGE_TRUE(flattenUniformArrays);
|
||||||
MERGE_TRUE(useUnknownFormat);
|
MERGE_TRUE(useUnknownFormat);
|
||||||
MERGE_TRUE(hlslOffsets);
|
MERGE_TRUE(hlslOffsets);
|
||||||
@@ -579,9 +586,6 @@ void TIntermediate::mergeGlobalUniformBlocks(TInfoSink& infoSink, TIntermediate&
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unit) {
|
void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* block, TIntermSymbol* unitBlock, TIntermediate* unit) {
|
||||||
if (block->getType() == unitBlock->getType()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (block->getType().getTypeName() != unitBlock->getType().getTypeName() ||
|
if (block->getType().getTypeName() != unitBlock->getType().getTypeName() ||
|
||||||
block->getType().getBasicType() != unitBlock->getType().getBasicType() ||
|
block->getType().getBasicType() != unitBlock->getType().getBasicType() ||
|
||||||
@@ -628,44 +632,42 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TType unitType;
|
|
||||||
unitType.shallowCopy(unitBlock->getType());
|
|
||||||
|
|
||||||
// update symbol node in unit tree,
|
// update symbol node in unit tree,
|
||||||
// and other nodes that may reference it
|
// and other nodes that may reference it
|
||||||
class TMergeBlockTraverser : public TIntermTraverser {
|
class TMergeBlockTraverser : public TIntermTraverser {
|
||||||
public:
|
public:
|
||||||
TMergeBlockTraverser(const glslang::TType &type, const glslang::TType& unitType,
|
TMergeBlockTraverser(const TIntermSymbol* newSym)
|
||||||
glslang::TIntermediate& unit,
|
: newSymbol(newSym), unitType(nullptr), unit(nullptr), memberIndexUpdates(nullptr)
|
||||||
const std::map<unsigned int, unsigned int>& memberIdxUpdates) :
|
{
|
||||||
newType(type), unitType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates)
|
}
|
||||||
{ }
|
TMergeBlockTraverser(const TIntermSymbol* newSym, const glslang::TType* unitType, glslang::TIntermediate* unit,
|
||||||
virtual ~TMergeBlockTraverser() { }
|
const std::map<unsigned int, unsigned int>* memberIdxUpdates)
|
||||||
|
: newSymbol(newSym), unitType(unitType), unit(unit), memberIndexUpdates(memberIdxUpdates)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual ~TMergeBlockTraverser() {}
|
||||||
|
|
||||||
const glslang::TType& newType; // type with modifications
|
const TIntermSymbol* newSymbol;
|
||||||
const glslang::TType& unitType; // copy of original type
|
const glslang::TType* unitType; // copy of original type
|
||||||
glslang::TIntermediate& unit; // intermediate that is being updated
|
glslang::TIntermediate* unit; // intermediate that is being updated
|
||||||
const std::map<unsigned int, unsigned int>& memberIndexUpdates;
|
const std::map<unsigned int, unsigned int>* memberIndexUpdates;
|
||||||
|
|
||||||
virtual void visitSymbol(TIntermSymbol* symbol)
|
virtual void visitSymbol(TIntermSymbol* symbol)
|
||||||
{
|
{
|
||||||
glslang::TType& symType = symbol->getWritableType();
|
if (newSymbol->getAccessName() == symbol->getAccessName() &&
|
||||||
|
newSymbol->getQualifier().getBlockStorage() == symbol->getQualifier().getBlockStorage()) {
|
||||||
if (symType == unitType) {
|
// Each symbol node may have a local copy of the block structure.
|
||||||
// each symbol node has a local copy of the unitType
|
// Update those structures to match the new one post-merge
|
||||||
// if merging involves changing properties that aren't shared objects
|
*(symbol->getWritableType().getWritableStruct()) = *(newSymbol->getType().getStruct());
|
||||||
// they should be updated in all instances
|
|
||||||
|
|
||||||
// e.g. the struct list is a ptr to an object, so it can be updated
|
|
||||||
// once, outside the traverser
|
|
||||||
//*symType.getWritableStruct() = *newType.getStruct();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool visitBinary(TVisit, glslang::TIntermBinary* node)
|
virtual bool visitBinary(TVisit, glslang::TIntermBinary* node)
|
||||||
{
|
{
|
||||||
if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == unitType) {
|
if (!unit || !unitType || !memberIndexUpdates || memberIndexUpdates->empty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (node->getOp() == EOpIndexDirectStruct && node->getLeft()->getType() == *unitType) {
|
||||||
// this is a dereference to a member of the block since the
|
// this is a dereference to a member of the block since the
|
||||||
// member list changed, need to update this to point to the
|
// member list changed, need to update this to point to the
|
||||||
// right index
|
// right index
|
||||||
@@ -673,8 +675,8 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl
|
|||||||
|
|
||||||
glslang::TIntermConstantUnion* constNode = node->getRight()->getAsConstantUnion();
|
glslang::TIntermConstantUnion* constNode = node->getRight()->getAsConstantUnion();
|
||||||
unsigned int memberIdx = constNode->getConstArray()[0].getUConst();
|
unsigned int memberIdx = constNode->getConstArray()[0].getUConst();
|
||||||
unsigned int newIdx = memberIndexUpdates.at(memberIdx);
|
unsigned int newIdx = memberIndexUpdates->at(memberIdx);
|
||||||
TIntermTyped* newConstNode = unit.addConstantUnion(newIdx, node->getRight()->getLoc());
|
TIntermTyped* newConstNode = unit->addConstantUnion(newIdx, node->getRight()->getLoc());
|
||||||
|
|
||||||
node->setRight(newConstNode);
|
node->setRight(newConstNode);
|
||||||
delete constNode;
|
delete constNode;
|
||||||
@@ -683,10 +685,20 @@ void TIntermediate::mergeBlockDefinitions(TInfoSink& infoSink, TIntermSymbol* bl
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} finalLinkTraverser(block->getType(), unitType, *unit, memberIndexUpdates);
|
};
|
||||||
|
|
||||||
// update the tree to use the new type
|
// 'this' may have symbols that are using the old block structure, so traverse the tree to update those
|
||||||
unit->getTreeRoot()->traverse(&finalLinkTraverser);
|
// in 'visitSymbol'
|
||||||
|
TMergeBlockTraverser finalLinkTraverser(block);
|
||||||
|
getTreeRoot()->traverse(&finalLinkTraverser);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
unit->getTreeRoot()->traverse(&unitFinalLinkTraverser);
|
||||||
|
|
||||||
// update the member list
|
// update the member list
|
||||||
(*unitMemberList) = (*memberList);
|
(*unitMemberList) = (*memberList);
|
||||||
@@ -759,7 +771,10 @@ void TIntermediate::mergeLinkerObjects(TInfoSink& infoSink, TIntermSequence& lin
|
|||||||
|
|
||||||
auto checkName = [this, unitSymbol, &infoSink](const TString& name) {
|
auto checkName = [this, unitSymbol, &infoSink](const TString& name) {
|
||||||
for (unsigned int i = 0; i < unitSymbol->getType().getStruct()->size(); ++i) {
|
for (unsigned int i = 0; i < unitSymbol->getType().getStruct()->size(); ++i) {
|
||||||
if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName()) {
|
if (name == (*unitSymbol->getType().getStruct())[i].type->getFieldName()
|
||||||
|
&& !((*unitSymbol->getType().getStruct())[i].type->getQualifier().hasLocation()
|
||||||
|
|| unitSymbol->getType().getQualifier().hasLocation())
|
||||||
|
) {
|
||||||
error(infoSink, "Anonymous member name used for global variable or other anonymous member: ");
|
error(infoSink, "Anonymous member name used for global variable or other anonymous member: ");
|
||||||
infoSink.info << (*unitSymbol->getType().getStruct())[i].type->getCompleteString() << "\n";
|
infoSink.info << (*unitSymbol->getType().getStruct())[i].type->getCompleteString() << "\n";
|
||||||
}
|
}
|
||||||
@@ -815,6 +830,10 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
|
|||||||
#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
|
#if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
|
||||||
bool crossStage = getStage() != unitStage;
|
bool crossStage = getStage() != unitStage;
|
||||||
bool writeTypeComparison = false;
|
bool writeTypeComparison = false;
|
||||||
|
bool errorReported = false;
|
||||||
|
bool printQualifiers = false;
|
||||||
|
bool printPrecision = false;
|
||||||
|
bool printType = false;
|
||||||
|
|
||||||
// Types have to match
|
// Types have to match
|
||||||
{
|
{
|
||||||
@@ -846,11 +865,48 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
|
|||||||
(symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()));
|
(symbol.getType().isUnsizedArray() || unitSymbol.getType().isUnsizedArray()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!symbol.getType().sameElementType(unitSymbol.getType()) ||
|
int lpidx = -1;
|
||||||
!symbol.getType().sameTypeParameters(unitSymbol.getType()) ||
|
int rpidx = -1;
|
||||||
!arraysMatch ) {
|
if (!symbol.getType().sameElementType(unitSymbol.getType(), &lpidx, &rpidx)) {
|
||||||
|
if (lpidx >= 0 && rpidx >= 0) {
|
||||||
|
error(infoSink, "Member names and types must match:", unitStage);
|
||||||
|
infoSink.info << " Block: " << symbol.getType().getTypeName() << "\n";
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: \""
|
||||||
|
<< (*symbol.getType().getStruct())[lpidx].type->getCompleteString(true, false, false, true,
|
||||||
|
(*symbol.getType().getStruct())[lpidx].type->getFieldName()) << "\"\n";
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: \""
|
||||||
|
<< (*unitSymbol.getType().getStruct())[rpidx].type->getCompleteString(true, false, false, true,
|
||||||
|
(*unitSymbol.getType().getStruct())[rpidx].type->getFieldName()) << "\"\n";
|
||||||
|
errorReported = true;
|
||||||
|
} else if (lpidx >= 0 && rpidx == -1) {
|
||||||
|
TString errmsg = StageName(getStage());
|
||||||
|
errmsg.append(" block member has no corresponding member in ").append(StageName(unitStage)).append(" block:");
|
||||||
|
error(infoSink, errmsg.c_str(), unitStage);
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: "
|
||||||
|
<< (*symbol.getType().getStruct())[lpidx].type->getFieldName() << "\n";
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: n/a \n";
|
||||||
|
errorReported = true;
|
||||||
|
} else if (lpidx == -1 && rpidx >= 0) {
|
||||||
|
TString errmsg = StageName(unitStage);
|
||||||
|
errmsg.append(" block member has no corresponding member in ").append(StageName(getStage())).append(" block:");
|
||||||
|
error(infoSink, errmsg.c_str(), unitStage);
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: "
|
||||||
|
<< (*unitSymbol.getType().getStruct())[rpidx].type->getFieldName() << "\n";
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: n/a \n";
|
||||||
|
errorReported = true;
|
||||||
|
} else {
|
||||||
|
error(infoSink, "Types must match:", unitStage);
|
||||||
|
writeTypeComparison = true;
|
||||||
|
printType = true;
|
||||||
|
}
|
||||||
|
} else if (!arraysMatch) {
|
||||||
|
error(infoSink, "Array sizes must be compatible:", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
error(infoSink, "Types must match:");
|
printType = true;
|
||||||
|
} else if (!symbol.getType().sameTypeParameters(unitSymbol.getType())) {
|
||||||
|
error(infoSink, "Type parameters must match:", unitStage);
|
||||||
|
writeTypeComparison = true;
|
||||||
|
printType = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -858,17 +914,51 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
|
|||||||
if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock &&
|
if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock &&
|
||||||
symbol.getType().getStruct() && unitSymbol.getType().getStruct() &&
|
symbol.getType().getStruct() && unitSymbol.getType().getStruct() &&
|
||||||
symbol.getType().sameStructType(unitSymbol.getType())) {
|
symbol.getType().sameStructType(unitSymbol.getType())) {
|
||||||
for (unsigned int i = 0; i < symbol.getType().getStruct()->size(); ++i) {
|
unsigned int li = 0;
|
||||||
const TQualifier& qualifier = (*symbol.getType().getStruct())[i].type->getQualifier();
|
unsigned int ri = 0;
|
||||||
const TQualifier& unitQualifier = (*unitSymbol.getType().getStruct())[i].type->getQualifier();
|
while (li < symbol.getType().getStruct()->size() && ri < unitSymbol.getType().getStruct()->size()) {
|
||||||
if (qualifier.layoutMatrix != unitQualifier.layoutMatrix ||
|
if ((*symbol.getType().getStruct())[li].type->hiddenMember()) {
|
||||||
qualifier.layoutOffset != unitQualifier.layoutOffset ||
|
++li;
|
||||||
qualifier.layoutAlign != unitQualifier.layoutAlign ||
|
continue;
|
||||||
qualifier.layoutLocation != unitQualifier.layoutLocation ||
|
|
||||||
qualifier.layoutComponent != unitQualifier.layoutComponent) {
|
|
||||||
error(infoSink, "Interface block member layout qualifiers must match:");
|
|
||||||
writeTypeComparison = true;
|
|
||||||
}
|
}
|
||||||
|
if ((*unitSymbol.getType().getStruct())[ri].type->hiddenMember()) {
|
||||||
|
++ri;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const TQualifier& qualifier = (*symbol.getType().getStruct())[li].type->getQualifier();
|
||||||
|
const TQualifier & unitQualifier = (*unitSymbol.getType().getStruct())[ri].type->getQualifier();
|
||||||
|
bool layoutQualifierError = false;
|
||||||
|
if (qualifier.layoutMatrix != unitQualifier.layoutMatrix) {
|
||||||
|
error(infoSink, "Interface block member layout matrix qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (qualifier.layoutOffset != unitQualifier.layoutOffset) {
|
||||||
|
error(infoSink, "Interface block member layout offset qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (qualifier.layoutAlign != unitQualifier.layoutAlign) {
|
||||||
|
error(infoSink, "Interface block member layout align qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (qualifier.layoutLocation != unitQualifier.layoutLocation) {
|
||||||
|
error(infoSink, "Interface block member layout location qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (qualifier.layoutComponent != unitQualifier.layoutComponent) {
|
||||||
|
error(infoSink, "Interface block member layout component qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (layoutQualifierError) {
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << ", Member: "
|
||||||
|
<< (*symbol.getType().getStruct())[li].type->getFieldName() << " \""
|
||||||
|
<< (*symbol.getType().getStruct())[li].type->getCompleteString(true, true, false, false) << "\"\n";
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << ", Member: "
|
||||||
|
<< (*unitSymbol.getType().getStruct())[ri].type->getFieldName() << " \""
|
||||||
|
<< (*unitSymbol.getType().getStruct())[ri].type->getCompleteString(true, true, false, false) << "\"\n";
|
||||||
|
errorReported = true;
|
||||||
|
}
|
||||||
|
++li;
|
||||||
|
++ri;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -879,8 +969,9 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
|
|||||||
// Qualifiers have to (almost) match
|
// Qualifiers have to (almost) match
|
||||||
// Storage...
|
// Storage...
|
||||||
if (!isInOut && symbol.getQualifier().storage != unitSymbol.getQualifier().storage) {
|
if (!isInOut && symbol.getQualifier().storage != unitSymbol.getQualifier().storage) {
|
||||||
error(infoSink, "Storage qualifiers must match:");
|
error(infoSink, "Storage qualifiers must match:", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
|
printQualifiers = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uniform and buffer blocks must either both have an instance name, or
|
// Uniform and buffer blocks must either both have an instance name, or
|
||||||
@@ -888,33 +979,36 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
|
|||||||
if (symbol.getQualifier().isUniformOrBuffer() &&
|
if (symbol.getQualifier().isUniformOrBuffer() &&
|
||||||
(IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()))) {
|
(IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()))) {
|
||||||
error(infoSink, "Matched Uniform or Storage blocks must all be anonymous,"
|
error(infoSink, "Matched Uniform or Storage blocks must all be anonymous,"
|
||||||
" or all be named:");
|
" or all be named:", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symbol.getQualifier().storage == unitSymbol.getQualifier().storage &&
|
if (symbol.getQualifier().storage == unitSymbol.getQualifier().storage &&
|
||||||
(IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()) ||
|
(IsAnonymous(symbol.getName()) != IsAnonymous(unitSymbol.getName()) ||
|
||||||
(!IsAnonymous(symbol.getName()) && symbol.getName() != unitSymbol.getName()))) {
|
(!IsAnonymous(symbol.getName()) && symbol.getName() != unitSymbol.getName()))) {
|
||||||
warn(infoSink, "Matched shader interfaces are using different instance names.");
|
warn(infoSink, "Matched shader interfaces are using different instance names.", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Precision...
|
// Precision...
|
||||||
if (!isInOut && symbol.getQualifier().precision != unitSymbol.getQualifier().precision) {
|
if (!isInOut && symbol.getQualifier().precision != unitSymbol.getQualifier().precision) {
|
||||||
error(infoSink, "Precision qualifiers must match:");
|
error(infoSink, "Precision qualifiers must match:", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
|
printPrecision = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invariance...
|
// Invariance...
|
||||||
if (! crossStage && symbol.getQualifier().invariant != unitSymbol.getQualifier().invariant) {
|
if (! crossStage && symbol.getQualifier().invariant != unitSymbol.getQualifier().invariant) {
|
||||||
error(infoSink, "Presence of invariant qualifier must match:");
|
error(infoSink, "Presence of invariant qualifier must match:", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
|
printQualifiers = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Precise...
|
// Precise...
|
||||||
if (! crossStage && symbol.getQualifier().isNoContraction() != unitSymbol.getQualifier().isNoContraction()) {
|
if (! crossStage && symbol.getQualifier().isNoContraction() != unitSymbol.getQualifier().isNoContraction()) {
|
||||||
error(infoSink, "Presence of precise qualifier must match:");
|
error(infoSink, "Presence of precise qualifier must match:", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
|
printPrecision = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auxiliary and interpolation...
|
// Auxiliary and interpolation...
|
||||||
@@ -928,57 +1022,137 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
|
|||||||
symbol.getQualifier().isSample()!= unitSymbol.getQualifier().isSample() ||
|
symbol.getQualifier().isSample()!= unitSymbol.getQualifier().isSample() ||
|
||||||
symbol.getQualifier().isPatch() != unitSymbol.getQualifier().isPatch() ||
|
symbol.getQualifier().isPatch() != unitSymbol.getQualifier().isPatch() ||
|
||||||
symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective())) {
|
symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective())) {
|
||||||
error(infoSink, "Interpolation and auxiliary storage qualifiers must match:");
|
error(infoSink, "Interpolation and auxiliary storage qualifiers must match:", unitStage);
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
|
printQualifiers = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Memory...
|
// Memory...
|
||||||
if (symbol.getQualifier().coherent != unitSymbol.getQualifier().coherent ||
|
bool memoryQualifierError = false;
|
||||||
symbol.getQualifier().devicecoherent != unitSymbol.getQualifier().devicecoherent ||
|
if (symbol.getQualifier().coherent != unitSymbol.getQualifier().coherent) {
|
||||||
symbol.getQualifier().queuefamilycoherent != unitSymbol.getQualifier().queuefamilycoherent ||
|
error(infoSink, "Memory coherent qualifier must match:", unitStage);
|
||||||
symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent ||
|
memoryQualifierError = true;
|
||||||
symbol.getQualifier().subgroupcoherent != unitSymbol.getQualifier().subgroupcoherent ||
|
}
|
||||||
symbol.getQualifier().shadercallcoherent!= unitSymbol.getQualifier().shadercallcoherent ||
|
if (symbol.getQualifier().devicecoherent != unitSymbol.getQualifier().devicecoherent) {
|
||||||
symbol.getQualifier().nonprivate != unitSymbol.getQualifier().nonprivate ||
|
error(infoSink, "Memory devicecoherent qualifier must match:", unitStage);
|
||||||
symbol.getQualifier().volatil != unitSymbol.getQualifier().volatil ||
|
memoryQualifierError = true;
|
||||||
symbol.getQualifier().restrict != unitSymbol.getQualifier().restrict ||
|
}
|
||||||
symbol.getQualifier().readonly != unitSymbol.getQualifier().readonly ||
|
if (symbol.getQualifier().queuefamilycoherent != unitSymbol.getQualifier().queuefamilycoherent) {
|
||||||
symbol.getQualifier().writeonly != unitSymbol.getQualifier().writeonly) {
|
error(infoSink, "Memory queuefamilycoherent qualifier must match:", unitStage);
|
||||||
error(infoSink, "Memory qualifiers must match:");
|
memoryQualifierError = true;
|
||||||
writeTypeComparison = true;
|
}
|
||||||
|
if (symbol.getQualifier().workgroupcoherent != unitSymbol.getQualifier().workgroupcoherent) {
|
||||||
|
error(infoSink, "Memory workgroupcoherent qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().subgroupcoherent != unitSymbol.getQualifier().subgroupcoherent) {
|
||||||
|
error(infoSink, "Memory subgroupcoherent qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().shadercallcoherent != unitSymbol.getQualifier().shadercallcoherent) {
|
||||||
|
error(infoSink, "Memory shadercallcoherent qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().nonprivate != unitSymbol.getQualifier().nonprivate) {
|
||||||
|
error(infoSink, "Memory nonprivate qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().volatil != unitSymbol.getQualifier().volatil) {
|
||||||
|
error(infoSink, "Memory volatil qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().restrict != unitSymbol.getQualifier().restrict) {
|
||||||
|
error(infoSink, "Memory restrict qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().readonly != unitSymbol.getQualifier().readonly) {
|
||||||
|
error(infoSink, "Memory readonly qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().writeonly != unitSymbol.getQualifier().writeonly) {
|
||||||
|
error(infoSink, "Memory writeonly qualifier must match:", unitStage);
|
||||||
|
memoryQualifierError = true;
|
||||||
|
}
|
||||||
|
if (memoryQualifierError) {
|
||||||
|
writeTypeComparison = true;
|
||||||
|
printQualifiers = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Layouts...
|
// Layouts...
|
||||||
// TODO: 4.4 enhanced layouts: Generalize to include offset/align: current spec
|
// TODO: 4.4 enhanced layouts: Generalize to include offset/align: current spec
|
||||||
// requires separate user-supplied offset from actual computed offset, but
|
// requires separate user-supplied offset from actual computed offset, but
|
||||||
// current implementation only has one offset.
|
// current implementation only has one offset.
|
||||||
if (symbol.getQualifier().layoutMatrix != unitSymbol.getQualifier().layoutMatrix ||
|
bool layoutQualifierError = false;
|
||||||
symbol.getQualifier().layoutPacking != unitSymbol.getQualifier().layoutPacking ||
|
if (symbol.getQualifier().layoutMatrix != unitSymbol.getQualifier().layoutMatrix) {
|
||||||
(symbol.getQualifier().hasLocation() && unitSymbol.getQualifier().hasLocation() && symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation) ||
|
error(infoSink, "Layout matrix qualifier must match:", unitStage);
|
||||||
symbol.getQualifier().layoutComponent != unitSymbol.getQualifier().layoutComponent ||
|
layoutQualifierError = true;
|
||||||
symbol.getQualifier().layoutIndex != unitSymbol.getQualifier().layoutIndex ||
|
}
|
||||||
(symbol.getQualifier().hasBinding() && unitSymbol.getQualifier().hasBinding() && symbol.getQualifier().layoutBinding != unitSymbol.getQualifier().layoutBinding) ||
|
if (symbol.getQualifier().layoutPacking != unitSymbol.getQualifier().layoutPacking) {
|
||||||
(symbol.getQualifier().hasBinding() && (symbol.getQualifier().layoutOffset != unitSymbol.getQualifier().layoutOffset))) {
|
error(infoSink, "Layout packing qualifier must match:", unitStage);
|
||||||
error(infoSink, "Layout qualification must match:");
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().hasLocation() && unitSymbol.getQualifier().hasLocation() && symbol.getQualifier().layoutLocation != unitSymbol.getQualifier().layoutLocation) {
|
||||||
|
error(infoSink, "Layout location qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().layoutComponent != unitSymbol.getQualifier().layoutComponent) {
|
||||||
|
error(infoSink, "Layout component qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().layoutIndex != unitSymbol.getQualifier().layoutIndex) {
|
||||||
|
error(infoSink, "Layout index qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().hasBinding() && unitSymbol.getQualifier().hasBinding() && symbol.getQualifier().layoutBinding != unitSymbol.getQualifier().layoutBinding) {
|
||||||
|
error(infoSink, "Layout binding qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (symbol.getQualifier().hasBinding() && (symbol.getQualifier().layoutOffset != unitSymbol.getQualifier().layoutOffset)) {
|
||||||
|
error(infoSink, "Layout offset qualifier must match:", unitStage);
|
||||||
|
layoutQualifierError = true;
|
||||||
|
}
|
||||||
|
if (layoutQualifierError) {
|
||||||
writeTypeComparison = true;
|
writeTypeComparison = true;
|
||||||
|
printQualifiers = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initializers have to match, if both are present, and if we don't already know the types don't match
|
// Initializers have to match, if both are present, and if we don't already know the types don't match
|
||||||
if (! writeTypeComparison) {
|
if (! writeTypeComparison && ! errorReported) {
|
||||||
if (! symbol.getConstArray().empty() && ! unitSymbol.getConstArray().empty()) {
|
if (! symbol.getConstArray().empty() && ! unitSymbol.getConstArray().empty()) {
|
||||||
if (symbol.getConstArray() != unitSymbol.getConstArray()) {
|
if (symbol.getConstArray() != unitSymbol.getConstArray()) {
|
||||||
error(infoSink, "Initializers must match:");
|
error(infoSink, "Initializers must match:", unitStage);
|
||||||
infoSink.info << " " << symbol.getName() << "\n";
|
infoSink.info << " " << symbol.getName() << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (writeTypeComparison) {
|
if (writeTypeComparison) {
|
||||||
infoSink.info << " " << symbol.getName() << ": \"" << symbol.getType().getCompleteString() << "\" versus ";
|
if (symbol.getType().getBasicType() == EbtBlock && unitSymbol.getType().getBasicType() == EbtBlock &&
|
||||||
if (symbol.getName() != unitSymbol.getName())
|
symbol.getType().getStruct() && unitSymbol.getType().getStruct()) {
|
||||||
infoSink.info << unitSymbol.getName() << ": ";
|
if (printType) {
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: \"" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision,
|
||||||
infoSink.info << "\"" << unitSymbol.getType().getCompleteString() << "\"\n";
|
printType, symbol.getName(), symbol.getType().getTypeName()) << "\"\n";
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: \"" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision,
|
||||||
|
printType, unitSymbol.getName(), unitSymbol.getType().getTypeName()) << "\"\n";
|
||||||
|
} else {
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: Block: " << symbol.getType().getTypeName() << " Instance: " << symbol.getName()
|
||||||
|
<< ": \"" << symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: Block: " << unitSymbol.getType().getTypeName() << " Instance: " << unitSymbol.getName()
|
||||||
|
<< ": \"" << unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (printType) {
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: \""
|
||||||
|
<< symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, symbol.getName()) << "\"\n";
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: \""
|
||||||
|
<< unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType, unitSymbol.getName()) << "\"\n";
|
||||||
|
} else {
|
||||||
|
infoSink.info << " " << StageName(getStage()) << " stage: " << symbol.getName() << " \""
|
||||||
|
<< symbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
|
||||||
|
infoSink.info << " " << StageName(unitStage) << " stage: " << unitSymbol.getName() << " \""
|
||||||
|
<< unitSymbol.getType().getCompleteString(true, printQualifiers, printPrecision, printType) << "\"\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -1786,7 +1960,7 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int numComponents;
|
int numComponents {0};
|
||||||
if (type.isScalar())
|
if (type.isScalar())
|
||||||
numComponents = 1;
|
numComponents = 1;
|
||||||
else if (type.isVector())
|
else if (type.isVector())
|
||||||
|
|||||||
@@ -290,6 +290,8 @@ public:
|
|||||||
resources(TBuiltInResource{}),
|
resources(TBuiltInResource{}),
|
||||||
numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
|
numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
|
||||||
invertY(false),
|
invertY(false),
|
||||||
|
dxPositionW(false),
|
||||||
|
enhancedMsgs(false),
|
||||||
useStorageBuffer(false),
|
useStorageBuffer(false),
|
||||||
invariantAll(false),
|
invariantAll(false),
|
||||||
nanMinMaxClamp(false),
|
nanMinMaxClamp(false),
|
||||||
@@ -307,7 +309,7 @@ public:
|
|||||||
useVulkanMemoryModel(false),
|
useVulkanMemoryModel(false),
|
||||||
invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet),
|
invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet),
|
||||||
inputPrimitive(ElgNone), outputPrimitive(ElgNone),
|
inputPrimitive(ElgNone), outputPrimitive(ElgNone),
|
||||||
pixelCenterInteger(false), originUpperLeft(false),
|
pixelCenterInteger(false), originUpperLeft(false),texCoordBuiltinRedeclared(false),
|
||||||
vertexSpacing(EvsNone), vertexOrder(EvoNone), interlockOrdering(EioNone), pointMode(false), earlyFragmentTests(false),
|
vertexSpacing(EvsNone), vertexOrder(EvoNone), interlockOrdering(EioNone), pointMode(false), earlyFragmentTests(false),
|
||||||
postDepthCoverage(false), depthLayout(EldNone),
|
postDepthCoverage(false), depthLayout(EldNone),
|
||||||
hlslFunctionality1(false),
|
hlslFunctionality1(false),
|
||||||
@@ -397,6 +399,9 @@ public:
|
|||||||
case EShTargetSpv_1_5:
|
case EShTargetSpv_1_5:
|
||||||
processes.addProcess("target-env spirv1.5");
|
processes.addProcess("target-env spirv1.5");
|
||||||
break;
|
break;
|
||||||
|
case EShTargetSpv_1_6:
|
||||||
|
processes.addProcess("target-env spirv1.6");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
processes.addProcess("target-env spirvUnknown");
|
processes.addProcess("target-env spirvUnknown");
|
||||||
break;
|
break;
|
||||||
@@ -415,6 +420,9 @@ public:
|
|||||||
case EShTargetVulkan_1_2:
|
case EShTargetVulkan_1_2:
|
||||||
processes.addProcess("target-env vulkan1.2");
|
processes.addProcess("target-env vulkan1.2");
|
||||||
break;
|
break;
|
||||||
|
case EShTargetVulkan_1_3:
|
||||||
|
processes.addProcess("target-env vulkan1.3");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
processes.addProcess("target-env vulkanUnknown");
|
processes.addProcess("target-env vulkanUnknown");
|
||||||
break;
|
break;
|
||||||
@@ -460,6 +468,20 @@ public:
|
|||||||
}
|
}
|
||||||
bool getInvertY() const { return invertY; }
|
bool getInvertY() const { return invertY; }
|
||||||
|
|
||||||
|
void setDxPositionW(bool dxPosW)
|
||||||
|
{
|
||||||
|
dxPositionW = dxPosW;
|
||||||
|
if (dxPositionW)
|
||||||
|
processes.addProcess("dx-position-w");
|
||||||
|
}
|
||||||
|
bool getDxPositionW() const { return dxPositionW; }
|
||||||
|
|
||||||
|
void setEnhancedMsgs()
|
||||||
|
{
|
||||||
|
enhancedMsgs = true;
|
||||||
|
}
|
||||||
|
bool getEnhancedMsgs() const { return enhancedMsgs && source == EShSourceGlsl; }
|
||||||
|
|
||||||
#ifdef ENABLE_HLSL
|
#ifdef ENABLE_HLSL
|
||||||
void setSource(EShSource s) { source = s; }
|
void setSource(EShSource s) { source = s; }
|
||||||
EShSource getSource() const { return source; }
|
EShSource getSource() const { return source; }
|
||||||
@@ -812,6 +834,8 @@ public:
|
|||||||
bool getOriginUpperLeft() const { return originUpperLeft; }
|
bool getOriginUpperLeft() const { return originUpperLeft; }
|
||||||
void setPixelCenterInteger() { pixelCenterInteger = true; }
|
void setPixelCenterInteger() { pixelCenterInteger = true; }
|
||||||
bool getPixelCenterInteger() const { return pixelCenterInteger; }
|
bool getPixelCenterInteger() const { return pixelCenterInteger; }
|
||||||
|
void setTexCoordRedeclared() { texCoordBuiltinRedeclared = true; }
|
||||||
|
bool getTexCoordRedeclared() const { return texCoordBuiltinRedeclared; }
|
||||||
void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }
|
void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }
|
||||||
unsigned int getBlendEquations() const { return blendEquations; }
|
unsigned int getBlendEquations() const { return blendEquations; }
|
||||||
bool setXfbBufferStride(int buffer, unsigned stride)
|
bool setXfbBufferStride(int buffer, unsigned stride)
|
||||||
@@ -1016,8 +1040,8 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
TIntermSymbol* addSymbol(long long Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
|
TIntermSymbol* addSymbol(long long Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
|
||||||
void error(TInfoSink& infoSink, const char*);
|
void error(TInfoSink& infoSink, const char*, EShLanguage unitStage = EShLangCount);
|
||||||
void warn(TInfoSink& infoSink, const char*);
|
void warn(TInfoSink& infoSink, const char*, EShLanguage unitStage = EShLangCount);
|
||||||
void mergeCallGraphs(TInfoSink&, TIntermediate&);
|
void mergeCallGraphs(TInfoSink&, TIntermediate&);
|
||||||
void mergeModes(TInfoSink&, TIntermediate&);
|
void mergeModes(TInfoSink&, TIntermediate&);
|
||||||
void mergeTrees(TInfoSink&, TIntermediate&);
|
void mergeTrees(TInfoSink&, TIntermediate&);
|
||||||
@@ -1070,6 +1094,8 @@ protected:
|
|||||||
int numPushConstants;
|
int numPushConstants;
|
||||||
bool recursive;
|
bool recursive;
|
||||||
bool invertY;
|
bool invertY;
|
||||||
|
bool dxPositionW;
|
||||||
|
bool enhancedMsgs;
|
||||||
bool useStorageBuffer;
|
bool useStorageBuffer;
|
||||||
bool invariantAll;
|
bool invariantAll;
|
||||||
bool nanMinMaxClamp; // true if desiring min/max/clamp to favor non-NaN over NaN
|
bool nanMinMaxClamp; // true if desiring min/max/clamp to favor non-NaN over NaN
|
||||||
@@ -1098,6 +1124,7 @@ protected:
|
|||||||
TLayoutGeometry outputPrimitive;
|
TLayoutGeometry outputPrimitive;
|
||||||
bool pixelCenterInteger;
|
bool pixelCenterInteger;
|
||||||
bool originUpperLeft;
|
bool originUpperLeft;
|
||||||
|
bool texCoordBuiltinRedeclared;
|
||||||
TVertexSpacing vertexSpacing;
|
TVertexSpacing vertexSpacing;
|
||||||
TVertexOrder vertexOrder;
|
TVertexOrder vertexOrder;
|
||||||
TInterlockOrdering interlockOrdering;
|
TInterlockOrdering interlockOrdering;
|
||||||
@@ -1158,6 +1185,7 @@ protected:
|
|||||||
// for callableData/callableDataIn
|
// for callableData/callableDataIn
|
||||||
// set of names of statically read/written I/O that might need extra checking
|
// set of names of statically read/written I/O that might need extra checking
|
||||||
std::set<TString> ioAccessed;
|
std::set<TString> ioAccessed;
|
||||||
|
|
||||||
// source code of shader, useful as part of debug information
|
// source code of shader, useful as part of debug information
|
||||||
std::string sourceFile;
|
std::string sourceFile;
|
||||||
std::string sourceText;
|
std::string sourceText;
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ namespace {
|
|||||||
pthread_mutex_t gMutex;
|
pthread_mutex_t gMutex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitGlobalLock()
|
static void InitMutex(void)
|
||||||
{
|
{
|
||||||
pthread_mutexattr_t mutexattr;
|
pthread_mutexattr_t mutexattr;
|
||||||
pthread_mutexattr_init(&mutexattr);
|
pthread_mutexattr_init(&mutexattr);
|
||||||
@@ -180,6 +180,12 @@ void InitGlobalLock()
|
|||||||
pthread_mutex_init(&gMutex, &mutexattr);
|
pthread_mutex_init(&gMutex, &mutexattr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InitGlobalLock()
|
||||||
|
{
|
||||||
|
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
||||||
|
pthread_once(&once, InitMutex);
|
||||||
|
}
|
||||||
|
|
||||||
void GetGlobalLock()
|
void GetGlobalLock()
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&gMutex);
|
pthread_mutex_lock(&gMutex);
|
||||||
|
|||||||
+16
-4
@@ -150,8 +150,8 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EShClientNone, // use when there is no client, e.g. for validation
|
EShClientNone, // use when there is no client, e.g. for validation
|
||||||
EShClientVulkan,
|
EShClientVulkan, // as GLSL dialect, specifies KHR_vulkan_glsl extension
|
||||||
EShClientOpenGL,
|
EShClientOpenGL, // as GLSL dialect, specifies ARB_gl_spirv extension
|
||||||
LAST_ELEMENT_MARKER(EShClientCount),
|
LAST_ELEMENT_MARKER(EShClientCount),
|
||||||
} EShClient;
|
} EShClient;
|
||||||
|
|
||||||
@@ -166,8 +166,9 @@ typedef enum {
|
|||||||
EShTargetVulkan_1_0 = (1 << 22), // Vulkan 1.0
|
EShTargetVulkan_1_0 = (1 << 22), // Vulkan 1.0
|
||||||
EShTargetVulkan_1_1 = (1 << 22) | (1 << 12), // Vulkan 1.1
|
EShTargetVulkan_1_1 = (1 << 22) | (1 << 12), // Vulkan 1.1
|
||||||
EShTargetVulkan_1_2 = (1 << 22) | (2 << 12), // Vulkan 1.2
|
EShTargetVulkan_1_2 = (1 << 22) | (2 << 12), // Vulkan 1.2
|
||||||
|
EShTargetVulkan_1_3 = (1 << 22) | (3 << 12), // Vulkan 1.3
|
||||||
EShTargetOpenGL_450 = 450, // OpenGL
|
EShTargetOpenGL_450 = 450, // OpenGL
|
||||||
LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 4),
|
LAST_ELEMENT_MARKER(EShTargetClientVersionCount = 5),
|
||||||
} EShTargetClientVersion;
|
} EShTargetClientVersion;
|
||||||
|
|
||||||
typedef EShTargetClientVersion EshTargetClientVersion;
|
typedef EShTargetClientVersion EshTargetClientVersion;
|
||||||
@@ -179,7 +180,8 @@ typedef enum {
|
|||||||
EShTargetSpv_1_3 = (1 << 16) | (3 << 8), // SPIR-V 1.3
|
EShTargetSpv_1_3 = (1 << 16) | (3 << 8), // SPIR-V 1.3
|
||||||
EShTargetSpv_1_4 = (1 << 16) | (4 << 8), // SPIR-V 1.4
|
EShTargetSpv_1_4 = (1 << 16) | (4 << 8), // SPIR-V 1.4
|
||||||
EShTargetSpv_1_5 = (1 << 16) | (5 << 8), // SPIR-V 1.5
|
EShTargetSpv_1_5 = (1 << 16) | (5 << 8), // SPIR-V 1.5
|
||||||
LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 6),
|
EShTargetSpv_1_6 = (1 << 16) | (6 << 8), // SPIR-V 1.6
|
||||||
|
LAST_ELEMENT_MARKER(EShTargetLanguageVersionCount = 7),
|
||||||
} EShTargetLanguageVersion;
|
} EShTargetLanguageVersion;
|
||||||
|
|
||||||
struct TInputLanguage {
|
struct TInputLanguage {
|
||||||
@@ -262,6 +264,7 @@ enum EShMessages : unsigned {
|
|||||||
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
||||||
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
|
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
|
||||||
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
||||||
|
EShMsgEnhanced = (1 << 15), // enhanced message readability
|
||||||
LAST_ELEMENT_MARKER(EShMsgCount),
|
LAST_ELEMENT_MARKER(EShMsgCount),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -468,6 +471,7 @@ public:
|
|||||||
GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName);
|
GLSLANG_EXPORT void setSourceEntryPoint(const char* sourceEntryPointName);
|
||||||
GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&);
|
GLSLANG_EXPORT void addProcesses(const std::vector<std::string>&);
|
||||||
GLSLANG_EXPORT void setUniqueId(unsigned long long id);
|
GLSLANG_EXPORT void setUniqueId(unsigned long long id);
|
||||||
|
GLSLANG_EXPORT void setOverrideVersion(int version);
|
||||||
|
|
||||||
// IO resolver binding data: see comments in ShaderLang.cpp
|
// IO resolver binding data: see comments in ShaderLang.cpp
|
||||||
GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base);
|
GLSLANG_EXPORT void setShiftBinding(TResourceType res, unsigned int base);
|
||||||
@@ -485,6 +489,8 @@ public:
|
|||||||
GLSLANG_EXPORT void addUniformLocationOverride(const char* name, int loc);
|
GLSLANG_EXPORT void addUniformLocationOverride(const char* name, int loc);
|
||||||
GLSLANG_EXPORT void setUniformLocationBase(int base);
|
GLSLANG_EXPORT void setUniformLocationBase(int base);
|
||||||
GLSLANG_EXPORT void setInvertY(bool invert);
|
GLSLANG_EXPORT void setInvertY(bool invert);
|
||||||
|
GLSLANG_EXPORT void setDxPositionW(bool dxPosW);
|
||||||
|
GLSLANG_EXPORT void setEnhancedMsgs();
|
||||||
#ifdef ENABLE_HLSL
|
#ifdef ENABLE_HLSL
|
||||||
GLSLANG_EXPORT void setHlslIoMapping(bool hlslIoMap);
|
GLSLANG_EXPORT void setHlslIoMapping(bool hlslIoMap);
|
||||||
GLSLANG_EXPORT void setFlattenUniformArrays(bool flatten);
|
GLSLANG_EXPORT void setFlattenUniformArrays(bool flatten);
|
||||||
@@ -512,6 +518,9 @@ public:
|
|||||||
// use EShClientNone and version of 0, e.g. for validation mode.
|
// use EShClientNone and version of 0, e.g. for validation mode.
|
||||||
// Note 'version' does not describe the target environment,
|
// Note 'version' does not describe the target environment,
|
||||||
// just the version of the source dialect to compile under.
|
// just the version of the source dialect to compile under.
|
||||||
|
// For example, to choose the Vulkan dialect of GLSL defined by
|
||||||
|
// version 100 of the KHR_vulkan_glsl extension: lang = EShSourceGlsl,
|
||||||
|
// dialect = EShClientVulkan, and version = 100.
|
||||||
//
|
//
|
||||||
// See the definitions of TEnvironment, EShSource, EShLanguage,
|
// See the definitions of TEnvironment, EShSource, EShLanguage,
|
||||||
// and EShClient for choices and more detail.
|
// and EShClient for choices and more detail.
|
||||||
@@ -703,6 +712,9 @@ protected:
|
|||||||
// a function in the source string can be renamed FROM this TO the name given in setEntryPoint.
|
// a function in the source string can be renamed FROM this TO the name given in setEntryPoint.
|
||||||
std::string sourceEntryPointName;
|
std::string sourceEntryPointName;
|
||||||
|
|
||||||
|
// overrides #version in shader source or default version if #version isn't present
|
||||||
|
int overrideVersion;
|
||||||
|
|
||||||
TEnvironment environment;
|
TEnvironment environment;
|
||||||
|
|
||||||
friend class TProgram;
|
friend class TProgram;
|
||||||
|
|||||||
+11
-1
@@ -233,8 +233,10 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"precise_struct_block.vert",
|
"precise_struct_block.vert",
|
||||||
"maxClipDistances.vert",
|
"maxClipDistances.vert",
|
||||||
"findFunction.frag",
|
"findFunction.frag",
|
||||||
|
"noMatchingFunction.frag",
|
||||||
"constantUnaryConversion.comp",
|
"constantUnaryConversion.comp",
|
||||||
"xfbUnsizedArray.error.vert",
|
"xfbUnsizedArray.error.vert",
|
||||||
|
"xfbUnsizedArray.error.tese",
|
||||||
"glsl.140.layoutOffset.error.vert",
|
"glsl.140.layoutOffset.error.vert",
|
||||||
"glsl.430.layoutOffset.error.vert",
|
"glsl.430.layoutOffset.error.vert",
|
||||||
"glsl.450.subgroup.frag",
|
"glsl.450.subgroup.frag",
|
||||||
@@ -284,8 +286,16 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"textureoffset_sampler2darrayshadow.vert",
|
"textureoffset_sampler2darrayshadow.vert",
|
||||||
"atomicAdd.comp",
|
"atomicAdd.comp",
|
||||||
"GL_ARB_gpu_shader5.u2i.vert",
|
"GL_ARB_gpu_shader5.u2i.vert",
|
||||||
|
"textureQueryLOD.frag",
|
||||||
"atomicCounterARBOps.vert",
|
"atomicCounterARBOps.vert",
|
||||||
"GL_EXT_shader_integer_mix.vert"
|
"GL_EXT_shader_integer_mix.vert",
|
||||||
|
"GL_ARB_draw_instanced.vert",
|
||||||
|
"GL_ARB_fragment_coord_conventions.vert",
|
||||||
|
"BestMatchFunction.vert",
|
||||||
|
"EndStreamPrimitive.geom",
|
||||||
|
"floatBitsToInt.vert",
|
||||||
|
"coord_conventions.frag",
|
||||||
|
"gl_FragCoord.frag"
|
||||||
})),
|
})),
|
||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
|||||||
+50
-1
@@ -109,7 +109,52 @@ bool verifyIOMapping(std::string& linkingError, glslang::TProgram& program) {
|
|||||||
success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
|
success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
success &= false;
|
if (!in.getType()->isStruct()) {
|
||||||
|
bool found = false;
|
||||||
|
for (auto outIt : pipeOut) {
|
||||||
|
if (outIt.second->getType()->isStruct()) {
|
||||||
|
unsigned int baseLoc = outIt.second->getType()->getQualifier().hasLocation() ?
|
||||||
|
outIt.second->getType()->getQualifier().layoutLocation :
|
||||||
|
std::numeric_limits<unsigned int>::max();
|
||||||
|
for (size_t j = 0; j < outIt.second->getType()->getStruct()->size(); j++) {
|
||||||
|
baseLoc = (*outIt.second->getType()->getStruct())[j].type->getQualifier().hasLocation() ?
|
||||||
|
(*outIt.second->getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc;
|
||||||
|
if (baseLoc != std::numeric_limits<unsigned int>::max()) {
|
||||||
|
if (baseLoc == in.getType()->getQualifier().layoutLocation) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
baseLoc += glslang::TIntermediate::computeTypeLocationSize(*(*outIt.second->getType()->getStruct())[j].type, EShLangVertex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
success &= found;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
unsigned int baseLoc = in.getType()->getQualifier().hasLocation() ? in.getType()->getQualifier().layoutLocation : -1;
|
||||||
|
for (size_t j = 0; j < in.getType()->getStruct()->size(); j++) {
|
||||||
|
baseLoc = (*in.getType()->getStruct())[j].type->getQualifier().hasLocation() ?
|
||||||
|
(*in.getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc;
|
||||||
|
if (baseLoc != std::numeric_limits<unsigned int>::max()) {
|
||||||
|
bool isMemberFound = false;
|
||||||
|
for (auto outIt : pipeOut) {
|
||||||
|
if (baseLoc == outIt.second->getType()->getQualifier().layoutLocation) {
|
||||||
|
isMemberFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isMemberFound) {
|
||||||
|
success &= false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
baseLoc += glslang::TIntermediate::computeTypeLocationSize(*(*in.getType()->getStruct())[j].type, EShLangVertex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -295,6 +340,10 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
::testing::ValuesIn(std::vector<IoMapData>({
|
::testing::ValuesIn(std::vector<IoMapData>({
|
||||||
{{"iomap.crossStage.vert", "iomap.crossStage.frag" }, Semantics::OpenGL},
|
{{"iomap.crossStage.vert", "iomap.crossStage.frag" }, Semantics::OpenGL},
|
||||||
{{"iomap.crossStage.2.vert", "iomap.crossStage.2.geom", "iomap.crossStage.2.frag" }, Semantics::OpenGL},
|
{{"iomap.crossStage.2.vert", "iomap.crossStage.2.geom", "iomap.crossStage.2.frag" }, Semantics::OpenGL},
|
||||||
|
{{"iomap.blockOutVariableIn.vert", "iomap.blockOutVariableIn.frag"}, Semantics::OpenGL},
|
||||||
|
{{"iomap.variableOutBlockIn.vert", "iomap.variableOutBlockIn.frag"}, Semantics::OpenGL},
|
||||||
|
{{"iomap.blockOutVariableIn.2.vert", "iomap.blockOutVariableIn.geom"}, Semantics::OpenGL},
|
||||||
|
{{"iomap.variableOutBlockIn.2.vert", "iomap.variableOutBlockIn.geom"}, Semantics::OpenGL},
|
||||||
// vulkan semantics
|
// vulkan semantics
|
||||||
{{"iomap.crossStage.vk.vert", "iomap.crossStage.vk.geom", "iomap.crossStage.vk.frag" }, Semantics::Vulkan},
|
{{"iomap.crossStage.vk.vert", "iomap.crossStage.vk.geom", "iomap.crossStage.vk.frag" }, Semantics::Vulkan},
|
||||||
}))
|
}))
|
||||||
|
|||||||
+19
@@ -59,6 +59,7 @@ std::string FileNameAsCustomTestSuffix(
|
|||||||
|
|
||||||
using HlslCompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslCompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslVulkan1_1CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
|
using HlslSpv1_6CompileTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
using HlslLegalizeTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslLegalizeTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
using HlslDebugTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
using HlslDebugTest = GlslangTest<::testing::TestWithParam<FileNameEntryPointPair>>;
|
||||||
@@ -81,6 +82,13 @@ TEST_P(HlslVulkan1_1CompileTest, FromFile)
|
|||||||
Target::BothASTAndSpv, true, GetParam().entryPoint);
|
Target::BothASTAndSpv, true, GetParam().entryPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_P(HlslSpv1_6CompileTest, FromFile)
|
||||||
|
{
|
||||||
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
|
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_3, glslang::EShTargetSpv_1_6,
|
||||||
|
Target::BothASTAndSpv, true, GetParam().entryPoint);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_P(HlslCompileAndFlattenTest, FromFile)
|
TEST_P(HlslCompileAndFlattenTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileFlattenUniformsAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
loadFileCompileFlattenUniformsAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
@@ -385,6 +393,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
{"hlsl.structbuffer.fn2.comp", "main"},
|
{"hlsl.structbuffer.fn2.comp", "main"},
|
||||||
{"hlsl.structbuffer.rw.frag", "main"},
|
{"hlsl.structbuffer.rw.frag", "main"},
|
||||||
{"hlsl.structbuffer.rwbyte.frag", "main"},
|
{"hlsl.structbuffer.rwbyte.frag", "main"},
|
||||||
|
{"hlsl.structbuffer.rwbyte2.comp", "main"},
|
||||||
{"hlsl.structin.vert", "main"},
|
{"hlsl.structin.vert", "main"},
|
||||||
{"hlsl.structIoFourWay.frag", "main"},
|
{"hlsl.structIoFourWay.frag", "main"},
|
||||||
{"hlsl.structStructName.frag", "main"},
|
{"hlsl.structStructName.frag", "main"},
|
||||||
@@ -449,6 +458,16 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
);
|
);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
ToSpirv, HlslSpv1_6CompileTest,
|
||||||
|
::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
|
||||||
|
{"hlsl.spv.1.6.discard.frag", "PixelShaderFunction"}
|
||||||
|
}),
|
||||||
|
FileNameAsCustomTestSuffix
|
||||||
|
);
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
INSTANTIATE_TEST_SUITE_P(
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
ToSpirv, HlslCompileAndFlattenTest,
|
ToSpirv, HlslCompileAndFlattenTest,
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
{"link.multiBlocksValid.1.0.vert", "link.multiBlocksValid.1.1.vert"},
|
{"link.multiBlocksValid.1.0.vert", "link.multiBlocksValid.1.1.vert"},
|
||||||
{"link.tesselation.vert", "link.tesselation.frag"},
|
{"link.tesselation.vert", "link.tesselation.frag"},
|
||||||
{"link.tesselation.tese", "link.tesselation.tesc"},
|
{"link.tesselation.tese", "link.tesselation.tesc"},
|
||||||
|
{"link.redeclareBuiltin.vert", "link.redeclareBuiltin.geom"},
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|||||||
+22
-1
@@ -69,6 +69,7 @@ using CompileVulkanToSpirvDeadCodeElimTest = GlslangTest<::testing::TestWithPara
|
|||||||
using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileToSpirv14Test = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileToSpirv14Test = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
|
using CompileToSpirv16Test = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
@@ -122,6 +123,13 @@ TEST_P(CompileToSpirv14Test, FromFile)
|
|||||||
Target::Spv);
|
Target::Spv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_P(CompileToSpirv16Test, FromFile)
|
||||||
|
{
|
||||||
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_3, glslang::EShTargetSpv_1_6,
|
||||||
|
Target::Spv);
|
||||||
|
}
|
||||||
|
|
||||||
// Compiling GLSL to SPIR-V under OpenGL semantics. Expected to successfully
|
// Compiling GLSL to SPIR-V under OpenGL semantics. Expected to successfully
|
||||||
// generate SPIR-V.
|
// generate SPIR-V.
|
||||||
TEST_P(CompileOpenGLToSpirvTest, FromFile)
|
TEST_P(CompileOpenGLToSpirvTest, FromFile)
|
||||||
@@ -365,7 +373,6 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"spv.int64.frag",
|
"spv.int64.frag",
|
||||||
"spv.intcoopmat.comp",
|
"spv.intcoopmat.comp",
|
||||||
"spv.intOps.vert",
|
"spv.intOps.vert",
|
||||||
"spv.intrinsicsSpecConst.vert",
|
|
||||||
"spv.intrinsicsSpirvByReference.vert",
|
"spv.intrinsicsSpirvByReference.vert",
|
||||||
"spv.intrinsicsSpirvDecorate.frag",
|
"spv.intrinsicsSpirvDecorate.frag",
|
||||||
"spv.intrinsicsSpirvExecutionMode.frag",
|
"spv.intrinsicsSpirvExecutionMode.frag",
|
||||||
@@ -373,6 +380,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"spv.intrinsicsSpirvLiteral.vert",
|
"spv.intrinsicsSpirvLiteral.vert",
|
||||||
"spv.intrinsicsSpirvStorageClass.rchit",
|
"spv.intrinsicsSpirvStorageClass.rchit",
|
||||||
"spv.intrinsicsSpirvType.rgen",
|
"spv.intrinsicsSpirvType.rgen",
|
||||||
|
"spv.intrinsicsSpirvTypeLocalVar.vert",
|
||||||
"spv.invariantAll.vert",
|
"spv.invariantAll.vert",
|
||||||
"spv.layer.tese",
|
"spv.layer.tese",
|
||||||
"spv.layoutNested.vert",
|
"spv.layoutNested.vert",
|
||||||
@@ -520,6 +528,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"spv.vulkan110.int16.frag",
|
"spv.vulkan110.int16.frag",
|
||||||
"spv.int32.frag",
|
"spv.int32.frag",
|
||||||
"spv.explicittypes.frag",
|
"spv.explicittypes.frag",
|
||||||
|
"spv.float16NoRelaxed.vert",
|
||||||
"spv.float32.frag",
|
"spv.float32.frag",
|
||||||
"spv.float64.frag",
|
"spv.float64.frag",
|
||||||
"spv.memoryScopeSemantics.comp",
|
"spv.memoryScopeSemantics.comp",
|
||||||
@@ -621,6 +630,18 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
|
Glsl, CompileToSpirv16Test,
|
||||||
|
::testing::ValuesIn(std::vector<std::string>({
|
||||||
|
"spv.1.6.conditionalDiscard.frag",
|
||||||
|
"spv.1.6.helperInvocation.frag",
|
||||||
|
"spv.1.6.specConstant.comp",
|
||||||
|
})),
|
||||||
|
FileNameAsCustomTestSuffix
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
INSTANTIATE_TEST_SUITE_P(
|
INSTANTIATE_TEST_SUITE_P(
|
||||||
Hlsl, HlslIoMap,
|
Hlsl, HlslIoMap,
|
||||||
|
|||||||
+3
-2
@@ -107,8 +107,8 @@ bool verifyIOMapping(std::string& linkingError, glslang::TProgram& program) {
|
|||||||
auto inQualifier = in.getType()->getQualifier();
|
auto inQualifier = in.getType()->getQualifier();
|
||||||
auto outQualifier = out->second->getType()->getQualifier();
|
auto outQualifier = out->second->getType()->getQualifier();
|
||||||
success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
|
success &= outQualifier.layoutLocation == inQualifier.layoutLocation;
|
||||||
}
|
// These are not part of a matched interface. Other cases still need to be added.
|
||||||
else {
|
} else if (name != "gl_FrontFacing" && name != "gl_FragCoord") {
|
||||||
success &= false;
|
success &= false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -293,6 +293,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
::testing::ValuesIn(std::vector<vkRelaxedData>({
|
::testing::ValuesIn(std::vector<vkRelaxedData>({
|
||||||
{{"vk.relaxed.frag"}},
|
{{"vk.relaxed.frag"}},
|
||||||
{{"vk.relaxed.link1.frag", "vk.relaxed.link2.frag"}},
|
{{"vk.relaxed.link1.frag", "vk.relaxed.link2.frag"}},
|
||||||
|
{{"vk.relaxed.stagelink.0.0.vert", "vk.relaxed.stagelink.0.1.vert", "vk.relaxed.stagelink.0.2.vert", "vk.relaxed.stagelink.0.0.frag", "vk.relaxed.stagelink.0.1.frag", "vk.relaxed.stagelink.0.2.frag"}},
|
||||||
{{"vk.relaxed.stagelink.vert", "vk.relaxed.stagelink.frag"}},
|
{{"vk.relaxed.stagelink.vert", "vk.relaxed.stagelink.frag"}},
|
||||||
{{"vk.relaxed.errorcheck.vert", "vk.relaxed.errorcheck.frag"}},
|
{{"vk.relaxed.errorcheck.vert", "vk.relaxed.errorcheck.frag"}},
|
||||||
{{"vk.relaxed.changeSet.vert", "vk.relaxed.changeSet.frag" }, { {"0"}, {"1"} } },
|
{{"vk.relaxed.changeSet.vert", "vk.relaxed.changeSet.frag" }, { {"0"}, {"1"} } },
|
||||||
|
|||||||
Vendored
+2
-2
@@ -5,14 +5,14 @@
|
|||||||
"site" : "github",
|
"site" : "github",
|
||||||
"subrepo" : "KhronosGroup/SPIRV-Tools",
|
"subrepo" : "KhronosGroup/SPIRV-Tools",
|
||||||
"subdir" : "External/spirv-tools",
|
"subdir" : "External/spirv-tools",
|
||||||
"commit" : "1fbed83c8aab8517d821fcb4164c08567951938f"
|
"commit" : "eed5c76a57bb965f2e1b56d1dc40b50910b5ec1d"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name" : "spirv-tools/external/spirv-headers",
|
"name" : "spirv-tools/external/spirv-headers",
|
||||||
"site" : "github",
|
"site" : "github",
|
||||||
"subrepo" : "KhronosGroup/SPIRV-Headers",
|
"subrepo" : "KhronosGroup/SPIRV-Headers",
|
||||||
"subdir" : "External/spirv-tools/external/spirv-headers",
|
"subdir" : "External/spirv-tools/external/spirv-headers",
|
||||||
"commit" : "449bc986ba6f4c5e10e32828783f9daef2a77644"
|
"commit" : "4995a2f2723c401eb0ea3e10c81298906bf1422b"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -15,6 +15,8 @@
|
|||||||
|
|
||||||
"_config.yml",
|
"_config.yml",
|
||||||
".*",
|
".*",
|
||||||
|
".github/workflows/*.yml",
|
||||||
|
".github/workflows/*.js",
|
||||||
"CMakeSettings.json",
|
"CMakeSettings.json",
|
||||||
"known_good_khr.json",
|
"known_good_khr.json",
|
||||||
"known_good.json",
|
"known_good.json",
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# Copyright 2017 The Glslang Authors. All rights reserved.
|
# Copyright 2017 The Glslang Authors. All rights reserved.
|
||||||
#
|
#
|
||||||
|
|||||||
+3
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
# The style used for all options not specifically set in the configuration.
|
# The style used for all options not specifically set in the configuration.
|
||||||
BasedOnStyle: LLVM
|
BasedOnStyle: LLVM
|
||||||
|
|
||||||
|
|||||||
+17
-1
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright 2020-2021 The Khronos Group, Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
name: CI
|
name: CI
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@@ -11,7 +14,7 @@ jobs:
|
|||||||
name: "Build ${{ matrix.platform }}"
|
name: "Build ${{ matrix.platform }}"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
platform: [windows-latest, ubuntu-16.04, ubuntu-18.04, ubuntu-20.04, macos-latest]
|
platform: [windows-latest, ubuntu-18.04, ubuntu-20.04, macos-latest]
|
||||||
env:
|
env:
|
||||||
PARALLEL: -j 2
|
PARALLEL: -j 2
|
||||||
|
|
||||||
@@ -51,4 +54,17 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
working-directory: ${{github.workspace}}/build
|
working-directory: ${{github.workspace}}/build
|
||||||
run: ctest --verbose -C Release
|
run: ctest --verbose -C Release
|
||||||
|
reuse:
|
||||||
|
name: "REUSE license check"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: khronosgroup/docker-images:asciidoctor-spec
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# REUSE license checker
|
||||||
|
- name: license-check
|
||||||
|
run: |
|
||||||
|
reuse lint
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
*.o
|
*.o
|
||||||
*.d
|
*.d
|
||||||
*.txt
|
*.txt
|
||||||
@@ -18,3 +21,4 @@
|
|||||||
*.vcxproj.user
|
*.vcxproj.user
|
||||||
|
|
||||||
!CMakeLists.txt
|
!CMakeLists.txt
|
||||||
|
!LICENSES/*.txt
|
||||||
|
|||||||
Vendored
+11
@@ -0,0 +1,11 @@
|
|||||||
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: SPIRV-Cross
|
||||||
|
Source: https://github.com/KhronosGroup/SPIRV-Cross
|
||||||
|
|
||||||
|
Files: shaders*/* reference/* tests-other/*
|
||||||
|
Copyright: 2016-2021 The Khronos Group, Inc.
|
||||||
|
License: Apache-2.0
|
||||||
|
|
||||||
|
Files: spirv.h spirv.hpp GLSL.std.450.h
|
||||||
|
Copyright: 2016-2021 The Khronos Group, Inc.
|
||||||
|
License: MIT
|
||||||
Vendored
-72
@@ -1,72 +0,0 @@
|
|||||||
language:
|
|
||||||
- cpp
|
|
||||||
- python
|
|
||||||
|
|
||||||
python: 3.9
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: linux
|
|
||||||
dist: trusty
|
|
||||||
compiler: gcc
|
|
||||||
env:
|
|
||||||
- GENERATOR="Unix Makefiles"
|
|
||||||
- ARTIFACT=gcc-trusty-64bit
|
|
||||||
- os: linux
|
|
||||||
dist: trusty
|
|
||||||
compiler: clang
|
|
||||||
env:
|
|
||||||
- GENERATOR="Unix Makefiles"
|
|
||||||
- ARTIFACT=clang-trusty-64bit
|
|
||||||
- os: osx
|
|
||||||
compiler: clang
|
|
||||||
osx_image: xcode10
|
|
||||||
env:
|
|
||||||
- GENERATOR="Unix Makefiles"
|
|
||||||
- ARTIFACT=clang-macos-64bit
|
|
||||||
- os: windows
|
|
||||||
before_install:
|
|
||||||
- choco install python3
|
|
||||||
- export PATH="/c/Python39:/c/Python39/Scripts:$PATH"
|
|
||||||
env:
|
|
||||||
- GENERATOR="Visual Studio 15 2017"
|
|
||||||
- ARTIFACT=vs2017-32bit
|
|
||||||
- os: windows
|
|
||||||
before_install:
|
|
||||||
- choco install python3
|
|
||||||
- export PATH="/c/Python39:/c/Python39/Scripts:$PATH"
|
|
||||||
env:
|
|
||||||
- GENERATOR="Visual Studio 15 2017 Win64"
|
|
||||||
- ARTIFACT=vs2017-64bit
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- "./checkout_glslang_spirv_tools.sh"
|
|
||||||
|
|
||||||
script:
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then PYTHON3=$(which python); fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then PYTHON3=$(which python3); fi
|
|
||||||
- "./build_glslang_spirv_tools.sh Release"
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- cmake .. -DSPIRV_CROSS_WERROR=ON -DSPIRV_CROSS_MISC_WARNINGS=ON -DSPIRV_CROSS_SHARED=ON -DCMAKE_INSTALL_PREFIX=output -DCMAKE_BUILD_TYPE=Release -G "${GENERATOR}" -DPYTHON_EXECUTABLE:FILEPATH="${PYTHON3}" -DSPIRV_CROSS_ENABLE_TESTS=ON
|
|
||||||
- cmake --build . --config Release
|
|
||||||
- cmake --build . --config Release --target install
|
|
||||||
- ctest --verbose -C Release
|
|
||||||
- cd ..
|
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
- REV=${ARTIFACT}-$(git rev-parse --short=10 HEAD)
|
|
||||||
- cd build/output
|
|
||||||
- tar cf spirv-cross-${REV}.tar *
|
|
||||||
- gzip spirv-cross-${REV}.tar
|
|
||||||
- cd ../..
|
|
||||||
- export FILE_TO_UPLOAD=build/output/spirv-cross-${REV}.tar.gz
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: releases
|
|
||||||
api_key:
|
|
||||||
secure: c7YEOyzhE19TFo76UnbLWk/kikRQxsHsOxzkOqN6Q2aL8joNRw5kmcG84rGd+Rf6isX62cykCzA6qHkyJCv9QTIzcyXnLju17rLvgib7cXDcseaq8x4mFvet2yUxCglthDpFY2M2LB0Aqws71lPeYIrKXa6hCFEh8jO3AWxnaor7O3RYfNZylM9d33HgH6KLT3sDx/cukwBstmKeg7EG9OUnrSvairkPW0W2+jlq3SXPlq/WeVhf8hQs3Yg0BluExGbmLOwe9EaeUpeGuJMyHRxXypnToQv1/KwoScKpap5tYxdNWiwRGZ4lYcmKrjAYVvilTioh654oX5LQpn34mE/oe8Ko9AaATkSaoiisRFp6meWtnB39oFBoL5Yn15DqLQpRXPr1AJsnBXSGAac3aDBO1j4MIqTHmYlYlfRw3n2ZsBaFaTZnv++438SNQ54nkivyoDTIWjoOmYa9+K4mQc3415RDdQmjZTJM+lu+GAlMmNBTVbfNvrbU55Usu9Lo6BZJKKdUMvdBB78kJ5FHvcBlL+eMgmk1pABQY0IZROCt7NztHcv1UmAxoWNxveSFs5glydPNNjNS8bogc4dzBGYG0KMmILbBHihVbY2toA1M9CMdDHdp+LucfDMmzECmYSEmlx0h8win+Jjb74/qpOhaXuUZ0NnzVgCOyeUYuMQ=
|
|
||||||
file: "${FILE_TO_UPLOAD}"
|
|
||||||
skip_cleanup: true
|
|
||||||
on:
|
|
||||||
tags: true
|
|
||||||
+3
-3
@@ -1,4 +1,5 @@
|
|||||||
# Copyright 2016-2021 Google Inc.
|
# Copyright 2016-2021 Google Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
#
|
#
|
||||||
# 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 not use this file except in compliance with the License.
|
||||||
@@ -16,7 +17,6 @@
|
|||||||
# At your option, you may choose to accept this material under either:
|
# At your option, you may choose to accept this material under either:
|
||||||
# 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
# 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
# 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
# 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
# SPDX-License-Identifier: Apache-2.0 OR MIT.
|
|
||||||
#
|
#
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0)
|
||||||
@@ -332,7 +332,7 @@ if (SPIRV_CROSS_STATIC)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(spirv-cross-abi-major 0)
|
set(spirv-cross-abi-major 0)
|
||||||
set(spirv-cross-abi-minor 47)
|
set(spirv-cross-abi-minor 49)
|
||||||
set(spirv-cross-abi-patch 0)
|
set(spirv-cross-abi-patch 0)
|
||||||
|
|
||||||
if (SPIRV_CROSS_SHARED)
|
if (SPIRV_CROSS_SHARED)
|
||||||
@@ -442,7 +442,7 @@ if (SPIRV_CROSS_CLI)
|
|||||||
target_compile_definitions(spirv-cross PRIVATE ${spirv-compiler-defines} HAVE_SPIRV_CROSS_GIT_VERSION)
|
target_compile_definitions(spirv-cross PRIVATE ${spirv-compiler-defines} HAVE_SPIRV_CROSS_GIT_VERSION)
|
||||||
set_target_properties(spirv-cross PROPERTIES LINK_FLAGS "${spirv-cross-link-flags}")
|
set_target_properties(spirv-cross PROPERTIES LINK_FLAGS "${spirv-cross-link-flags}")
|
||||||
if (NOT SPIRV_CROSS_SKIP_INSTALL)
|
if (NOT SPIRV_CROSS_SKIP_INSTALL)
|
||||||
install(TARGETS spirv-cross RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
|
install(TARGETS spirv-cross DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||||
endif()
|
endif()
|
||||||
target_link_libraries(spirv-cross PRIVATE
|
target_link_libraries(spirv-cross PRIVATE
|
||||||
spirv-cross-glsl
|
spirv-cross-glsl
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
// Copyright (c) 2016-2020 The Khronos Group Inc.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: CC-BY-4.0
|
||||||
|
|
||||||
|
= Code of Conduct
|
||||||
|
|
||||||
|
A reminder that this issue tracker is managed by the Khronos Group.
|
||||||
|
Interactions here should follow the
|
||||||
|
https://www.khronos.org/developers/code-of-conduct[Khronos Code of Conduct],
|
||||||
|
which prohibits aggressive or derogatory language. Please keep the
|
||||||
|
discussion friendly and civil.
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
A reminder that this issue tracker is managed by the Khronos Group. Interactions here should follow the Khronos Code of Conduct (https://www.khronos.org/developers/code-of-conduct), which prohibits aggressive or derogatory language. Please keep the discussion friendly and civil.
|
|
||||||
+6
-23
@@ -1,27 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
* Copyright 2014-2016,2021 The Khronos Group, Inc.
|
||||||
**
|
* SPDX-License-Identifier: MIT
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
*
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
* MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
||||||
** to deal in the Materials without restriction, including without limitation
|
* STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
* HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
||||||
** 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 GLSLstd450_H
|
#ifndef GLSLstd450_H
|
||||||
|
|||||||
+208
@@ -0,0 +1,208 @@
|
|||||||
|
Apache License
|
||||||
|
|
||||||
|
Version 2.0, January 2004
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION,
|
||||||
|
AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction, and distribution
|
||||||
|
as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by the copyright
|
||||||
|
owner that is granting the License.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all other entities
|
||||||
|
that control, are controlled by, or are under common control with that entity.
|
||||||
|
For the purposes of this definition, "control" means (i) the power, direct
|
||||||
|
or indirect, to cause the direction or management of such entity, whether
|
||||||
|
by contract or otherwise, or (ii) ownership of fifty percent (50%) or more
|
||||||
|
of the outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions
|
||||||
|
granted by this License.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications, including
|
||||||
|
but not limited to software source code, documentation source, and configuration
|
||||||
|
files.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical transformation
|
||||||
|
or translation of a Source form, including but not limited to compiled object
|
||||||
|
code, generated documentation, and conversions to other media types.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or Object form,
|
||||||
|
made available under the License, as indicated by a copyright notice that
|
||||||
|
is included in or attached to the work (an example is provided in the Appendix
|
||||||
|
below).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object form,
|
||||||
|
that is based on (or derived from) the Work and for which the editorial revisions,
|
||||||
|
annotations, elaborations, or other modifications represent, as a whole, an
|
||||||
|
original work of authorship. For the purposes of this License, Derivative
|
||||||
|
Works shall not include works that remain separable from, or merely link (or
|
||||||
|
bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including the original version
|
||||||
|
of the Work and any modifications or additions to that Work or Derivative
|
||||||
|
Works thereof, that is intentionally submitted to Licensor for inclusion in
|
||||||
|
the Work by the copyright owner or by an individual or Legal Entity authorized
|
||||||
|
to submit on behalf of the copyright owner. For the purposes of this definition,
|
||||||
|
"submitted" means any form of electronic, verbal, or written communication
|
||||||
|
sent to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems, and
|
||||||
|
issue tracking systems that are managed by, or on behalf of, the Licensor
|
||||||
|
for the purpose of discussing and improving the Work, but excluding communication
|
||||||
|
that is conspicuously marked or otherwise designated in writing by the copyright
|
||||||
|
owner as "Not a Contribution."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
|
||||||
|
of whom a Contribution has been received by Licensor and subsequently incorporated
|
||||||
|
within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of this
|
||||||
|
License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
||||||
|
no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
|
||||||
|
Derivative Works of, publicly display, publicly perform, sublicense, and distribute
|
||||||
|
the Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of this License,
|
||||||
|
each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
|
||||||
|
no-charge, royalty-free, irrevocable (except as stated in this section) patent
|
||||||
|
license to make, have made, use, offer to sell, sell, import, and otherwise
|
||||||
|
transfer the Work, where such license applies only to those patent claims
|
||||||
|
licensable by such Contributor that are necessarily infringed by their Contribution(s)
|
||||||
|
alone or by combination of their Contribution(s) with the Work to which such
|
||||||
|
Contribution(s) was submitted. If You institute patent litigation against
|
||||||
|
any entity (including a cross-claim or counterclaim in a lawsuit) alleging
|
||||||
|
that the Work or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses granted to You
|
||||||
|
under this License for that Work shall terminate as of the date such litigation
|
||||||
|
is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the Work or
|
||||||
|
Derivative Works thereof in any medium, with or without modifications, and
|
||||||
|
in Source or Object form, provided that You meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or Derivative Works a copy
|
||||||
|
of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices stating that
|
||||||
|
You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works that You distribute,
|
||||||
|
all copyright, patent, trademark, and attribution notices from the Source
|
||||||
|
form of the Work, excluding those notices that do not pertain to any part
|
||||||
|
of the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its distribution,
|
||||||
|
then any Derivative Works that You distribute must include a readable copy
|
||||||
|
of the attribution notices contained within such NOTICE file, excluding those
|
||||||
|
notices that do not pertain to any part of the Derivative Works, in at least
|
||||||
|
one of the following places: within a NOTICE text file distributed as part
|
||||||
|
of the Derivative Works; within the Source form or documentation, if provided
|
||||||
|
along with the Derivative Works; or, within a display generated by the Derivative
|
||||||
|
Works, if and wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and do not modify the
|
||||||
|
License. You may add Your own attribution notices within Derivative Works
|
||||||
|
that You distribute, alongside or as an addendum to the NOTICE text from the
|
||||||
|
Work, provided that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and may provide
|
||||||
|
additional or different license terms and conditions for use, reproduction,
|
||||||
|
or distribution of Your modifications, or for any such Derivative Works as
|
||||||
|
a whole, provided Your use, reproduction, and distribution of the Work otherwise
|
||||||
|
complies with the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise, any
|
||||||
|
Contribution intentionally submitted for inclusion in the Work by You to the
|
||||||
|
Licensor shall be under the terms and conditions of this License, without
|
||||||
|
any additional terms or conditions. Notwithstanding the above, nothing herein
|
||||||
|
shall supersede or modify the terms of any separate license agreement you
|
||||||
|
may have executed with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade names,
|
||||||
|
trademarks, service marks, or product names of the Licensor, except as required
|
||||||
|
for reasonable and customary use in describing the origin of the Work and
|
||||||
|
reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or agreed to
|
||||||
|
in writing, Licensor provides the Work (and each Contributor provides its
|
||||||
|
Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied, including, without limitation, any warranties
|
||||||
|
or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness
|
||||||
|
of using or redistributing the Work and assume any risks associated with Your
|
||||||
|
exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory, whether
|
||||||
|
in tort (including negligence), contract, or otherwise, unless required by
|
||||||
|
applicable law (such as deliberate and grossly negligent acts) or agreed to
|
||||||
|
in writing, shall any Contributor be liable to You for damages, including
|
||||||
|
any direct, indirect, special, incidental, or consequential damages of any
|
||||||
|
character arising as a result of this License or out of the use or inability
|
||||||
|
to use the Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all other commercial
|
||||||
|
damages or losses), even if such Contributor has been advised of the possibility
|
||||||
|
of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing the Work
|
||||||
|
or Derivative Works thereof, You may choose to offer, and charge a fee for,
|
||||||
|
acceptance of support, warranty, indemnity, or other liability obligations
|
||||||
|
and/or rights consistent with this License. However, in accepting such obligations,
|
||||||
|
You may act only on Your own behalf and on Your sole responsibility, not on
|
||||||
|
behalf of any other Contributor, and only if You agree to indemnify, defend,
|
||||||
|
and hold each Contributor harmless for any liability incurred by, or claims
|
||||||
|
asserted against, such Contributor by reason of your accepting any such warranty
|
||||||
|
or additional liability. END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following boilerplate
|
||||||
|
notice, with the fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
information. (Don't include the brackets!) The text should be enclosed in
|
||||||
|
the appropriate comment syntax for the file format. We also recommend that
|
||||||
|
a file or class name and description of purpose be included on the same "printed
|
||||||
|
page" as the copyright notice for easier identification within third-party
|
||||||
|
archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
||||||
+324
@@ -0,0 +1,324 @@
|
|||||||
|
Creative Commons Attribution 4.0 International Creative Commons Corporation
|
||||||
|
("Creative Commons") is not a law firm and does not provide legal services
|
||||||
|
or legal advice. Distribution of Creative Commons public licenses does not
|
||||||
|
create a lawyer-client or other relationship. Creative Commons makes its licenses
|
||||||
|
and related information available on an "as-is" basis. Creative Commons gives
|
||||||
|
no warranties regarding its licenses, any material licensed under their terms
|
||||||
|
and conditions, or any related information. Creative Commons disclaims all
|
||||||
|
liability for damages resulting from their use to the fullest extent possible.
|
||||||
|
|
||||||
|
Using Creative Commons Public Licenses
|
||||||
|
|
||||||
|
Creative Commons public licenses provide a standard set of terms and conditions
|
||||||
|
that creators and other rights holders may use to share original works of
|
||||||
|
authorship and other material subject to copyright and certain other rights
|
||||||
|
specified in the public license below. The following considerations are for
|
||||||
|
informational purposes only, are not exhaustive, and do not form part of our
|
||||||
|
licenses.
|
||||||
|
|
||||||
|
Considerations for licensors: Our public licenses are intended for use by
|
||||||
|
those authorized to give the public permission to use material in ways otherwise
|
||||||
|
restricted by copyright and certain other rights. Our licenses are irrevocable.
|
||||||
|
Licensors should read and understand the terms and conditions of the license
|
||||||
|
they choose before applying it. Licensors should also secure all rights necessary
|
||||||
|
before applying our licenses so that the public can reuse the material as
|
||||||
|
expected. Licensors should clearly mark any material not subject to the license.
|
||||||
|
This includes other CC-licensed material, or material used under an exception
|
||||||
|
or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors
|
||||||
|
|
||||||
|
Considerations for the public: By using one of our public licenses, a licensor
|
||||||
|
grants the public permission to use the licensed material under specified
|
||||||
|
terms and conditions. If the licensor's permission is not necessary for any
|
||||||
|
reason–for example, because of any applicable exception or limitation to copyright–then
|
||||||
|
that use is not regulated by the license. Our licenses grant only permissions
|
||||||
|
under copyright and certain other rights that a licensor has authority to
|
||||||
|
grant. Use of the licensed material may still be restricted for other reasons,
|
||||||
|
including because others have copyright or other rights in the material. A
|
||||||
|
licensor may make special requests, such as asking that all changes be marked
|
||||||
|
or described. Although not required by our licenses, you are encouraged to
|
||||||
|
respect those requests where reasonable. More considerations for the public
|
||||||
|
: wiki.creativecommons.org/Considerations_for_licensees Creative Commons Attribution
|
||||||
|
4.0 International Public License
|
||||||
|
|
||||||
|
By exercising the Licensed Rights (defined below), You accept and agree to
|
||||||
|
be bound by the terms and conditions of this Creative Commons Attribution
|
||||||
|
4.0 International Public License ("Public License"). To the extent this Public
|
||||||
|
License may be interpreted as a contract, You are granted the Licensed Rights
|
||||||
|
in consideration of Your acceptance of these terms and conditions, and the
|
||||||
|
Licensor grants You such rights in consideration of benefits the Licensor
|
||||||
|
receives from making the Licensed Material available under these terms and
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
Section 1 – Definitions.
|
||||||
|
|
||||||
|
a. Adapted Material means material subject to Copyright and Similar Rights
|
||||||
|
that is derived from or based upon the Licensed Material and in which the
|
||||||
|
Licensed Material is translated, altered, arranged, transformed, or otherwise
|
||||||
|
modified in a manner requiring permission under the Copyright and Similar
|
||||||
|
Rights held by the Licensor. For purposes of this Public License, where the
|
||||||
|
Licensed Material is a musical work, performance, or sound recording, Adapted
|
||||||
|
Material is always produced where the Licensed Material is synched in timed
|
||||||
|
relation with a moving image.
|
||||||
|
|
||||||
|
b. Adapter's License means the license You apply to Your Copyright and Similar
|
||||||
|
Rights in Your contributions to Adapted Material in accordance with the terms
|
||||||
|
and conditions of this Public License.
|
||||||
|
|
||||||
|
c. Copyright and Similar Rights means copyright and/or similar rights closely
|
||||||
|
related to copyright including, without limitation, performance, broadcast,
|
||||||
|
sound recording, and Sui Generis Database Rights, without regard to how the
|
||||||
|
rights are labeled or categorized. For purposes of this Public License, the
|
||||||
|
rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
||||||
|
|
||||||
|
d. Effective Technological Measures means those measures that, in the absence
|
||||||
|
of proper authority, may not be circumvented under laws fulfilling obligations
|
||||||
|
under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996,
|
||||||
|
and/or similar international agreements.
|
||||||
|
|
||||||
|
e. Exceptions and Limitations means fair use, fair dealing, and/or any other
|
||||||
|
exception or limitation to Copyright and Similar Rights that applies to Your
|
||||||
|
use of the Licensed Material.
|
||||||
|
|
||||||
|
f. Licensed Material means the artistic or literary work, database, or other
|
||||||
|
material to which the Licensor applied this Public License.
|
||||||
|
|
||||||
|
g. Licensed Rights means the rights granted to You subject to the terms and
|
||||||
|
conditions of this Public License, which are limited to all Copyright and
|
||||||
|
Similar Rights that apply to Your use of the Licensed Material and that the
|
||||||
|
Licensor has authority to license.
|
||||||
|
|
||||||
|
h. Licensor means the individual(s) or entity(ies) granting rights under this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
i. Share means to provide material to the public by any means or process that
|
||||||
|
requires permission under the Licensed Rights, such as reproduction, public
|
||||||
|
display, public performance, distribution, dissemination, communication, or
|
||||||
|
importation, and to make material available to the public including in ways
|
||||||
|
that members of the public may access the material from a place and at a time
|
||||||
|
individually chosen by them.
|
||||||
|
|
||||||
|
j. Sui Generis Database Rights means rights other than copyright resulting
|
||||||
|
from Directive 96/9/EC of the European Parliament and of the Council of 11
|
||||||
|
March 1996 on the legal protection of databases, as amended and/or succeeded,
|
||||||
|
as well as other essentially equivalent rights anywhere in the world.
|
||||||
|
|
||||||
|
k. You means the individual or entity exercising the Licensed Rights under
|
||||||
|
this Public License. Your has a corresponding meaning.
|
||||||
|
|
||||||
|
Section 2 – Scope.
|
||||||
|
|
||||||
|
a. License grant.
|
||||||
|
|
||||||
|
1. Subject to the terms and conditions of this Public License, the Licensor
|
||||||
|
hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive,
|
||||||
|
irrevocable license to exercise the Licensed Rights in the Licensed Material
|
||||||
|
to:
|
||||||
|
|
||||||
|
A. reproduce and Share the Licensed Material, in whole or in part; and
|
||||||
|
|
||||||
|
B. produce, reproduce, and Share Adapted Material.
|
||||||
|
|
||||||
|
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions
|
||||||
|
and Limitations apply to Your use, this Public License does not apply, and
|
||||||
|
You do not need to comply with its terms and conditions.
|
||||||
|
|
||||||
|
3. Term. The term of this Public License is specified in Section 6(a).
|
||||||
|
|
||||||
|
4. Media and formats; technical modifications allowed. The Licensor authorizes
|
||||||
|
You to exercise the Licensed Rights in all media and formats whether now known
|
||||||
|
or hereafter created, and to make technical modifications necessary to do
|
||||||
|
so. The Licensor waives and/or agrees not to assert any right or authority
|
||||||
|
to forbid You from making technical modifications necessary to exercise the
|
||||||
|
Licensed Rights, including technical modifications necessary to circumvent
|
||||||
|
Effective Technological Measures. For purposes of this Public License, simply
|
||||||
|
making modifications authorized by this Section 2(a)(4) never produces Adapted
|
||||||
|
Material.
|
||||||
|
|
||||||
|
5. Downstream recipients.
|
||||||
|
|
||||||
|
A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed
|
||||||
|
Material automatically receives an offer from the Licensor to exercise the
|
||||||
|
Licensed Rights under the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
B. No downstream restrictions. You may not offer or impose any additional
|
||||||
|
or different terms or conditions on, or apply any Effective Technological
|
||||||
|
Measures to, the Licensed Material if doing so restricts exercise of the Licensed
|
||||||
|
Rights by any recipient of the Licensed Material.
|
||||||
|
|
||||||
|
6. No endorsement. Nothing in this Public License constitutes or may be construed
|
||||||
|
as permission to assert or imply that You are, or that Your use of the Licensed
|
||||||
|
Material is, connected with, or sponsored, endorsed, or granted official status
|
||||||
|
by, the Licensor or others designated to receive attribution as provided in
|
||||||
|
Section 3(a)(1)(A)(i).
|
||||||
|
|
||||||
|
b. Other rights.
|
||||||
|
|
||||||
|
1. Moral rights, such as the right of integrity, are not licensed under this
|
||||||
|
Public License, nor are publicity, privacy, and/or other similar personality
|
||||||
|
rights; however, to the extent possible, the Licensor waives and/or agrees
|
||||||
|
not to assert any such rights held by the Licensor to the limited extent necessary
|
||||||
|
to allow You to exercise the Licensed Rights, but not otherwise.
|
||||||
|
|
||||||
|
2. Patent and trademark rights are not licensed under this Public License.
|
||||||
|
|
||||||
|
3. To the extent possible, the Licensor waives any right to collect royalties
|
||||||
|
from You for the exercise of the Licensed Rights, whether directly or through
|
||||||
|
a collecting society under any voluntary or waivable statutory or compulsory
|
||||||
|
licensing scheme. In all other cases the Licensor expressly reserves any right
|
||||||
|
to collect such royalties.
|
||||||
|
|
||||||
|
Section 3 – License Conditions.
|
||||||
|
|
||||||
|
Your exercise of the Licensed Rights is expressly made subject to the following
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
a. Attribution.
|
||||||
|
|
||||||
|
1. If You Share the Licensed Material (including in modified form), You must:
|
||||||
|
|
||||||
|
A. retain the following if it is supplied by the Licensor with the Licensed
|
||||||
|
Material:
|
||||||
|
|
||||||
|
i. identification of the creator(s) of the Licensed Material and any others
|
||||||
|
designated to receive attribution, in any reasonable manner requested by the
|
||||||
|
Licensor (including by pseudonym if designated);
|
||||||
|
|
||||||
|
ii. a copyright notice;
|
||||||
|
|
||||||
|
iii. a notice that refers to this Public License;
|
||||||
|
|
||||||
|
iv. a notice that refers to the disclaimer of warranties;
|
||||||
|
|
||||||
|
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
||||||
|
|
||||||
|
B. indicate if You modified the Licensed Material and retain an indication
|
||||||
|
of any previous modifications; and
|
||||||
|
|
||||||
|
C. indicate the Licensed Material is licensed under this Public License, and
|
||||||
|
include the text of, or the URI or hyperlink to, this Public License.
|
||||||
|
|
||||||
|
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner
|
||||||
|
based on the medium, means, and context in which You Share the Licensed Material.
|
||||||
|
For example, it may be reasonable to satisfy the conditions by providing a
|
||||||
|
URI or hyperlink to a resource that includes the required information.
|
||||||
|
|
||||||
|
3. If requested by the Licensor, You must remove any of the information required
|
||||||
|
by Section 3(a)(1)(A) to the extent reasonably practicable.
|
||||||
|
|
||||||
|
4. If You Share Adapted Material You produce, the Adapter's License You apply
|
||||||
|
must not prevent recipients of the Adapted Material from complying with this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
Section 4 – Sui Generis Database Rights.
|
||||||
|
|
||||||
|
Where the Licensed Rights include Sui Generis Database Rights that apply to
|
||||||
|
Your use of the Licensed Material:
|
||||||
|
|
||||||
|
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract,
|
||||||
|
reuse, reproduce, and Share all or a substantial portion of the contents of
|
||||||
|
the database;
|
||||||
|
|
||||||
|
b. if You include all or a substantial portion of the database contents in
|
||||||
|
a database in which You have Sui Generis Database Rights, then the database
|
||||||
|
in which You have Sui Generis Database Rights (but not its individual contents)
|
||||||
|
is Adapted Material; and
|
||||||
|
|
||||||
|
c. You must comply with the conditions in Section 3(a) if You Share all or
|
||||||
|
a substantial portion of the contents of the database.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 4 supplements and does not replace
|
||||||
|
Your obligations under this Public License where the Licensed Rights include
|
||||||
|
other Copyright and Similar Rights.
|
||||||
|
|
||||||
|
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||||
|
|
||||||
|
a. Unless otherwise separately undertaken by the Licensor, to the extent possible,
|
||||||
|
the Licensor offers the Licensed Material as-is and as-available, and makes
|
||||||
|
no representations or warranties of any kind concerning the Licensed Material,
|
||||||
|
whether express, implied, statutory, or other. This includes, without limitation,
|
||||||
|
warranties of title, merchantability, fitness for a particular purpose, non-infringement,
|
||||||
|
absence of latent or other defects, accuracy, or the presence or absence of
|
||||||
|
errors, whether or not known or discoverable. Where disclaimers of warranties
|
||||||
|
are not allowed in full or in part, this disclaimer may not apply to You.
|
||||||
|
|
||||||
|
b. To the extent possible, in no event will the Licensor be liable to You
|
||||||
|
on any legal theory (including, without limitation, negligence) or otherwise
|
||||||
|
for any direct, special, indirect, incidental, consequential, punitive, exemplary,
|
||||||
|
or other losses, costs, expenses, or damages arising out of this Public License
|
||||||
|
or use of the Licensed Material, even if the Licensor has been advised of
|
||||||
|
the possibility of such losses, costs, expenses, or damages. Where a limitation
|
||||||
|
of liability is not allowed in full or in part, this limitation may not apply
|
||||||
|
to You.
|
||||||
|
|
||||||
|
c. The disclaimer of warranties and limitation of liability provided above
|
||||||
|
shall be interpreted in a manner that, to the extent possible, most closely
|
||||||
|
approximates an absolute disclaimer and waiver of all liability.
|
||||||
|
|
||||||
|
Section 6 – Term and Termination.
|
||||||
|
|
||||||
|
a. This Public License applies for the term of the Copyright and Similar Rights
|
||||||
|
licensed here. However, if You fail to comply with this Public License, then
|
||||||
|
Your rights under this Public License terminate automatically.
|
||||||
|
|
||||||
|
b. Where Your right to use the Licensed Material has terminated under Section
|
||||||
|
6(a), it reinstates:
|
||||||
|
|
||||||
|
1. automatically as of the date the violation is cured, provided it is cured
|
||||||
|
within 30 days of Your discovery of the violation; or
|
||||||
|
|
||||||
|
2. upon express reinstatement by the Licensor.
|
||||||
|
|
||||||
|
c. For the avoidance of doubt, this Section 6(b) does not affect any right
|
||||||
|
the Licensor may have to seek remedies for Your violations of this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
d. For the avoidance of doubt, the Licensor may also offer the Licensed Material
|
||||||
|
under separate terms or conditions or stop distributing the Licensed Material
|
||||||
|
at any time; however, doing so will not terminate this Public License.
|
||||||
|
|
||||||
|
e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
||||||
|
|
||||||
|
Section 7 – Other Terms and Conditions.
|
||||||
|
|
||||||
|
a. The Licensor shall not be bound by any additional or different terms or
|
||||||
|
conditions communicated by You unless expressly agreed.
|
||||||
|
|
||||||
|
b. Any arrangements, understandings, or agreements regarding the Licensed
|
||||||
|
Material not stated herein are separate from and independent of the terms
|
||||||
|
and conditions of this Public License.
|
||||||
|
|
||||||
|
Section 8 – Interpretation.
|
||||||
|
|
||||||
|
a. For the avoidance of doubt, this Public License does not, and shall not
|
||||||
|
be interpreted to, reduce, limit, restrict, or impose conditions on any use
|
||||||
|
of the Licensed Material that could lawfully be made without permission under
|
||||||
|
this Public License.
|
||||||
|
|
||||||
|
b. To the extent possible, if any provision of this Public License is deemed
|
||||||
|
unenforceable, it shall be automatically reformed to the minimum extent necessary
|
||||||
|
to make it enforceable. If the provision cannot be reformed, it shall be severed
|
||||||
|
from this Public License without affecting the enforceability of the remaining
|
||||||
|
terms and conditions.
|
||||||
|
|
||||||
|
c. No term or condition of this Public License will be waived and no failure
|
||||||
|
to comply consented to unless expressly agreed to by the Licensor.
|
||||||
|
|
||||||
|
d. Nothing in this Public License constitutes or may be interpreted as a limitation
|
||||||
|
upon, or waiver of, any privileges and immunities that apply to the Licensor
|
||||||
|
or You, including from the legal processes of any jurisdiction or authority.
|
||||||
|
|
||||||
|
Creative Commons is not a party to its public licenses. Notwithstanding, Creative
|
||||||
|
Commons may elect to apply one of its public licenses to material it publishes
|
||||||
|
and in those instances will be considered the "Licensor." The text of the
|
||||||
|
Creative Commons public licenses is dedicated to the public domain under the
|
||||||
|
CC0 Public Domain Dedication. Except for the limited purpose of indicating
|
||||||
|
that material is shared under a Creative Commons public license or as otherwise
|
||||||
|
permitted by the Creative Commons policies published at creativecommons.org/policies,
|
||||||
|
Creative Commons does not authorize the use of the trademark "Creative Commons"
|
||||||
|
or any other trademark or logo of Creative Commons without its prior written
|
||||||
|
consent including, without limitation, in connection with any unauthorized
|
||||||
|
modifications to any of its public licenses or any other arrangements, understandings,
|
||||||
|
or agreements concerning use of licensed material. For the avoidance of doubt,
|
||||||
|
this paragraph does not form part of the public licenses.
|
||||||
|
|
||||||
|
Creative Commons may be contacted at creativecommons.org.
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
MIT License Copyright (c) <year> <copyright holders>
|
||||||
|
|
||||||
|
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 (including the next
|
||||||
|
paragraph) 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.
|
||||||
Vendored
+3
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
TARGET := spirv-cross
|
TARGET := spirv-cross
|
||||||
|
|
||||||
SOURCES := $(wildcard spirv_*.cpp)
|
SOURCES := $(wildcard spirv_*.cpp)
|
||||||
|
|||||||
+72
@@ -0,0 +1,72 @@
|
|||||||
|
// swift-tools-version:5.5
|
||||||
|
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||||
|
|
||||||
|
// Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "SPIRV-Cross",
|
||||||
|
products: [
|
||||||
|
// Products define the executables and libraries a package produces, and make them visible to other packages.
|
||||||
|
.library(
|
||||||
|
name: "SPIRV-Cross",
|
||||||
|
targets: ["SPIRV-Cross"]),
|
||||||
|
],
|
||||||
|
dependencies: [
|
||||||
|
// Dependencies declare other packages that this package depends on.
|
||||||
|
// .package(url: /* package url */, from: "1.0.0"),
|
||||||
|
],
|
||||||
|
targets: [
|
||||||
|
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
|
||||||
|
// Targets can depend on other targets in this package, and on products in packages this package depends on.
|
||||||
|
.target(
|
||||||
|
name: "SPIRV-Cross",
|
||||||
|
dependencies: [],
|
||||||
|
path: ".",
|
||||||
|
exclude: ["CMakeLists.txt",
|
||||||
|
"CODE_OF_CONDUCT.adoc",
|
||||||
|
"LICENSE",
|
||||||
|
"LICENSES",
|
||||||
|
"Makefile",
|
||||||
|
"README.md",
|
||||||
|
"appveyor.yml",
|
||||||
|
"build_glslang_spirv_tools.sh",
|
||||||
|
"checkout_glslang_spirv_tools.sh",
|
||||||
|
"cmake",
|
||||||
|
"format_all.sh",
|
||||||
|
"gn",
|
||||||
|
"main.cpp",
|
||||||
|
"pkg-config",
|
||||||
|
"reference",
|
||||||
|
"samples",
|
||||||
|
"shaders",
|
||||||
|
"shaders-hlsl",
|
||||||
|
"shaders-hlsl-no-opt",
|
||||||
|
"shaders-msl",
|
||||||
|
"shaders-msl-no-opt",
|
||||||
|
"shaders-no-opt",
|
||||||
|
"shaders-other",
|
||||||
|
"shaders-reflection",
|
||||||
|
"shaders-ue4",
|
||||||
|
"shaders-ue4-no-opt",
|
||||||
|
"test_shaders.py",
|
||||||
|
"test_shaders.sh",
|
||||||
|
"tests-other",
|
||||||
|
"update_test_shaders.sh"],
|
||||||
|
sources: ["spirv_cfg.cpp",
|
||||||
|
"spirv_cpp.cpp",
|
||||||
|
"spirv_cross.cpp",
|
||||||
|
"spirv_cross_c.cpp",
|
||||||
|
"spirv_cross_parsed_ir.cpp",
|
||||||
|
"spirv_cross_util.cpp",
|
||||||
|
"spirv_glsl.cpp",
|
||||||
|
"spirv_hlsl.cpp",
|
||||||
|
"spirv_msl.cpp",
|
||||||
|
"spirv_parser.cpp",
|
||||||
|
"spirv_reflect.cpp"],
|
||||||
|
publicHeadersPath: "."),
|
||||||
|
],
|
||||||
|
cxxLanguageStandard: .cxx14
|
||||||
|
)
|
||||||
Vendored
+26
-6
@@ -1,3 +1,8 @@
|
|||||||
|
<!--
|
||||||
|
Copyright 2020-2021 The Khronos Group, Inc.
|
||||||
|
SPDX-License-Identifier: CC-BY-4.0
|
||||||
|
-->
|
||||||
|
|
||||||
# SPIRV-Cross
|
# SPIRV-Cross
|
||||||
|
|
||||||
SPIRV-Cross is a tool designed for parsing and converting SPIR-V to other shader languages.
|
SPIRV-Cross is a tool designed for parsing and converting SPIR-V to other shader languages.
|
||||||
@@ -10,8 +15,8 @@ SPIRV-Cross is a tool designed for parsing and converting SPIR-V to other shader
|
|||||||
- Convert SPIR-V to readable, usable and efficient GLSL
|
- Convert SPIR-V to readable, usable and efficient GLSL
|
||||||
- Convert SPIR-V to readable, usable and efficient Metal Shading Language (MSL)
|
- Convert SPIR-V to readable, usable and efficient Metal Shading Language (MSL)
|
||||||
- Convert SPIR-V to readable, usable and efficient HLSL
|
- Convert SPIR-V to readable, usable and efficient HLSL
|
||||||
|
- Convert SPIR-V to a JSON reflection format
|
||||||
- Convert SPIR-V to debuggable C++ [DEPRECATED]
|
- Convert SPIR-V to debuggable C++ [DEPRECATED]
|
||||||
- Convert SPIR-V to a JSON reflection format [EXPERIMENTAL]
|
|
||||||
- Reflection API to simplify the creation of Vulkan pipeline layouts
|
- Reflection API to simplify the creation of Vulkan pipeline layouts
|
||||||
- Reflection API to modify and tweak OpDecorations
|
- Reflection API to modify and tweak OpDecorations
|
||||||
- Supports "all" of vertex, fragment, tessellation, geometry and compute shaders.
|
- Supports "all" of vertex, fragment, tessellation, geometry and compute shaders.
|
||||||
@@ -376,10 +381,28 @@ for (auto &remap : compiler->get_combined_image_samplers())
|
|||||||
If your target is Vulkan GLSL, `--vulkan-semantics` will emit separate image samplers as you'd expect.
|
If your target is Vulkan GLSL, `--vulkan-semantics` will emit separate image samplers as you'd expect.
|
||||||
The command line client calls `Compiler::build_combined_image_samplers` automatically, but if you're calling the library, you'll need to do this yourself.
|
The command line client calls `Compiler::build_combined_image_samplers` automatically, but if you're calling the library, you'll need to do this yourself.
|
||||||
|
|
||||||
#### Descriptor sets (Vulkan GLSL) for backends which do not support them (HLSL/GLSL/Metal)
|
#### Descriptor sets (Vulkan GLSL) for backends which do not support them (pre HLSL 5.1 / GLSL)
|
||||||
|
|
||||||
Descriptor sets are unique to Vulkan, so make sure that descriptor set + binding is remapped to a flat binding scheme (set always 0), so that other APIs can make sense of the bindings.
|
Descriptor sets are unique to Vulkan, so make sure that descriptor set + binding is remapped to a flat binding scheme (set always 0), so that other APIs can make sense of the bindings.
|
||||||
This can be done with `Compiler::set_decoration(id, spv::DecorationDescriptorSet)`.
|
This can be done with `Compiler::set_decoration(id, spv::DecorationDescriptorSet)`. For other backends like MSL and HLSL, descriptor sets
|
||||||
|
can be used, with some minor caveats, see below.
|
||||||
|
|
||||||
|
##### MSL 2.0+
|
||||||
|
|
||||||
|
Metal supports indirect argument buffers (--msl-argument-buffers). In this case, descriptor sets become argument buffers,
|
||||||
|
and bindings are mapped to [[id(N)]] within the argument buffer. One quirk is that arrays of resources consume multiple ids,
|
||||||
|
where Vulkan does not. This can be worked around either from shader authoring stage
|
||||||
|
or remapping bindings as needed to avoid the overlap.
|
||||||
|
There is also a rich API to declare remapping schemes which is intended to work like
|
||||||
|
the pipeline layout in Vulkan. See `CompilerMSL::add_msl_resource_binding`. Remapping combined image samplers for example
|
||||||
|
must be split into two bindings in MSL, so it's possible to declare an id for the texture and sampler binding separately.
|
||||||
|
|
||||||
|
##### HLSL - SM 5.1+
|
||||||
|
|
||||||
|
In SM 5.1+, descriptor set bindings are interpreted as register spaces directly. In HLSL however, arrays of resources consume
|
||||||
|
multiple binding slots where Vulkan does not, so there might be overlap if the SPIR-V was not authored with this in mind.
|
||||||
|
This can be worked around either from shader authoring stage (don't assign overlapping bindings)
|
||||||
|
or remap bindings in SPIRV-Cross as needed to avoid the overlap.
|
||||||
|
|
||||||
#### Linking by name for targets which do not support explicit locations (legacy GLSL/ESSL)
|
#### Linking by name for targets which do not support explicit locations (legacy GLSL/ESSL)
|
||||||
|
|
||||||
@@ -439,9 +462,6 @@ All pull requests should ensure that test output does not change unexpectedly. T
|
|||||||
|
|
||||||
```
|
```
|
||||||
./checkout_glslang_spirv_tools.sh # Checks out glslang and SPIRV-Tools at a fixed revision which matches the reference output.
|
./checkout_glslang_spirv_tools.sh # Checks out glslang and SPIRV-Tools at a fixed revision which matches the reference output.
|
||||||
# NOTE: Some users have reported problems cloning from git:// paths. To use https:// instead pass in
|
|
||||||
# $ PROTOCOL=https ./checkout_glslang_spirv_tools.sh
|
|
||||||
# instead.
|
|
||||||
./build_glslang_spirv_tools.sh # Builds glslang and SPIRV-Tools.
|
./build_glslang_spirv_tools.sh # Builds glslang and SPIRV-Tools.
|
||||||
./test_shaders.sh # Runs over all changes and makes sure that there are no deltas compared to reference files.
|
./test_shaders.sh # Runs over all changes and makes sure that there are no deltas compared to reference files.
|
||||||
```
|
```
|
||||||
|
|||||||
Vendored
+2
@@ -1,3 +1,5 @@
|
|||||||
|
# Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
PROFILE=Release
|
PROFILE=Release
|
||||||
|
|
||||||
|
|||||||
+6
-9
@@ -1,14 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
GLSLANG_REV=3de5cfe50edecd001e6d703555284d9b10b3dd57
|
GLSLANG_REV=df609a01b386001e367709086c58529c48028d1e
|
||||||
SPIRV_TOOLS_REV=f3ccb633dfd7c5de1f9f0a2d2e9d7a25f2478206
|
SPIRV_TOOLS_REV=75e53b9f685830ac42242cf0c46cc9af523bd0df
|
||||||
SPIRV_HEADERS_REV=f027d53ded7e230e008d37c8b47ede7cd308e19d
|
SPIRV_HEADERS_REV=b8047fbe45f426f5918fadc67e8408f5b108c3c9
|
||||||
|
PROTOCOL=https
|
||||||
if [ -z $PROTOCOL ]; then
|
|
||||||
PROTOCOL=git
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Using protocol \"$PROTOCOL\" for checking out repositories. If this is problematic, try PROTOCOL=https $0."
|
|
||||||
|
|
||||||
if [ -d external/glslang ]; then
|
if [ -d external/glslang ]; then
|
||||||
echo "Updating glslang to revision $GLSLANG_REV."
|
echo "Updating glslang to revision $GLSLANG_REV."
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_GIT_VERSION_H_
|
#ifndef SPIRV_CROSS_GIT_VERSION_H_
|
||||||
#define SPIRV_CROSS_GIT_VERSION_H_
|
#define SPIRV_CROSS_GIT_VERSION_H_
|
||||||
|
|
||||||
|
|||||||
+2
@@ -1,4 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Copyright 2016-2021 The Khronos Group Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
#for file in spirv_*.{cpp,hpp} include/spirv_cross/*.{hpp,h} samples/cpp/*.cpp main.cpp
|
#for file in spirv_*.{cpp,hpp} include/spirv_cross/*.{hpp,h} samples/cpp/*.cpp main.cpp
|
||||||
for file in spirv_*.{cpp,hpp} main.cpp
|
for file in spirv_*.{cpp,hpp} main.cpp
|
||||||
|
|||||||
Vendored
+1
@@ -1,4 +1,5 @@
|
|||||||
# Copyright (C) 2019 Google, Inc.
|
# Copyright (C) 2019 Google, Inc.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
# 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 not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015-2017 ARM Limited
|
* Copyright 2015-2017 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* 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 not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015-2017 ARM Limited
|
* Copyright 2015-2017 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* 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 not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015-2017 ARM Limited
|
* Copyright 2015-2017 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* 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 not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015-2017 ARM Limited
|
* Copyright 2015-2017 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* 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 not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015-2017 ARM Limited
|
* Copyright 2015-2017 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* 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 not use this file except in compliance with the License.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015-2017 ARM Limited
|
* Copyright 2015-2017 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* 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 not use this file except in compliance with the License.
|
||||||
|
|||||||
Vendored
+49
-27
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2015-2021 Arm Limited
|
* Copyright 2015-2021 Arm Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
*
|
*
|
||||||
* 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 not use this file except in compliance with the License.
|
||||||
@@ -18,7 +19,6 @@
|
|||||||
* At your option, you may choose to accept this material under either:
|
* At your option, you may choose to accept this material under either:
|
||||||
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "spirv_cpp.hpp"
|
#include "spirv_cpp.hpp"
|
||||||
@@ -77,7 +77,7 @@ struct CLICallbacks
|
|||||||
struct CLIParser
|
struct CLIParser
|
||||||
{
|
{
|
||||||
CLIParser(CLICallbacks cbs_, int argc_, char *argv_[])
|
CLIParser(CLICallbacks cbs_, int argc_, char *argv_[])
|
||||||
: cbs(move(cbs_))
|
: cbs(std::move(cbs_))
|
||||||
, argc(argc_)
|
, argc(argc_)
|
||||||
, argv(argv_)
|
, argv(argv_)
|
||||||
{
|
{
|
||||||
@@ -400,6 +400,12 @@ static void print_resources(const Compiler &compiler, const char *tag, const Sma
|
|||||||
fprintf(stderr, " writeonly");
|
fprintf(stderr, " writeonly");
|
||||||
if (mask.get(DecorationNonWritable))
|
if (mask.get(DecorationNonWritable))
|
||||||
fprintf(stderr, " readonly");
|
fprintf(stderr, " readonly");
|
||||||
|
if (mask.get(DecorationRestrict))
|
||||||
|
fprintf(stderr, " restrict");
|
||||||
|
if (mask.get(DecorationCoherent))
|
||||||
|
fprintf(stderr, " coherent");
|
||||||
|
if (mask.get(DecorationVolatile))
|
||||||
|
fprintf(stderr, " volatile");
|
||||||
if (is_sized_block)
|
if (is_sized_block)
|
||||||
{
|
{
|
||||||
fprintf(stderr, " (BlockSize : %u bytes)", block_size);
|
fprintf(stderr, " (BlockSize : %u bytes)", block_size);
|
||||||
@@ -662,12 +668,15 @@ struct CLIArguments
|
|||||||
bool glsl_emit_push_constant_as_ubo = false;
|
bool glsl_emit_push_constant_as_ubo = false;
|
||||||
bool glsl_emit_ubo_as_plain_uniforms = false;
|
bool glsl_emit_ubo_as_plain_uniforms = false;
|
||||||
bool glsl_force_flattened_io_blocks = false;
|
bool glsl_force_flattened_io_blocks = false;
|
||||||
|
uint32_t glsl_ovr_multiview_view_count = 0;
|
||||||
SmallVector<pair<uint32_t, uint32_t>> glsl_ext_framebuffer_fetch;
|
SmallVector<pair<uint32_t, uint32_t>> glsl_ext_framebuffer_fetch;
|
||||||
bool glsl_ext_framebuffer_fetch_noncoherent = false;
|
bool glsl_ext_framebuffer_fetch_noncoherent = false;
|
||||||
bool vulkan_glsl_disable_ext_samplerless_texture_functions = false;
|
bool vulkan_glsl_disable_ext_samplerless_texture_functions = false;
|
||||||
bool emit_line_directives = false;
|
bool emit_line_directives = false;
|
||||||
bool enable_storage_image_qualifier_deduction = true;
|
bool enable_storage_image_qualifier_deduction = true;
|
||||||
bool force_zero_initialized_variables = false;
|
bool force_zero_initialized_variables = false;
|
||||||
|
bool relax_nan_checks = false;
|
||||||
|
uint32_t force_recompile_max_debug_iterations = 3;
|
||||||
SmallVector<uint32_t> msl_discrete_descriptor_sets;
|
SmallVector<uint32_t> msl_discrete_descriptor_sets;
|
||||||
SmallVector<uint32_t> msl_device_argument_buffers;
|
SmallVector<uint32_t> msl_device_argument_buffers;
|
||||||
SmallVector<pair<uint32_t, uint32_t>> msl_dynamic_buffers;
|
SmallVector<pair<uint32_t, uint32_t>> msl_dynamic_buffers;
|
||||||
@@ -779,6 +788,7 @@ static void print_help_glsl()
|
|||||||
"\t[--remap-variable-type <variable_name> <new_variable_type>]:\n\t\tRemaps a variable type based on name.\n"
|
"\t[--remap-variable-type <variable_name> <new_variable_type>]:\n\t\tRemaps a variable type based on name.\n"
|
||||||
"\t\tPrimary use case is supporting external samplers in ESSL for video rendering on Android where you could remap a texture to a YUV one.\n"
|
"\t\tPrimary use case is supporting external samplers in ESSL for video rendering on Android where you could remap a texture to a YUV one.\n"
|
||||||
"\t[--glsl-force-flattened-io-blocks]:\n\t\tAlways flatten I/O blocks and structs.\n"
|
"\t[--glsl-force-flattened-io-blocks]:\n\t\tAlways flatten I/O blocks and structs.\n"
|
||||||
|
"\t[--glsl-ovr-multiview-view-count count]:\n\t\tIn GL_OVR_multiview2, specify layout(num_views).\n"
|
||||||
);
|
);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
@@ -788,6 +798,9 @@ static void print_help_hlsl()
|
|||||||
// clang-format off
|
// clang-format off
|
||||||
fprintf(stderr, "\nHLSL options:\n"
|
fprintf(stderr, "\nHLSL options:\n"
|
||||||
"\t[--shader-model]:\n\t\tEnables a specific shader model, e.g. --shader-model 50 for SM 5.0.\n"
|
"\t[--shader-model]:\n\t\tEnables a specific shader model, e.g. --shader-model 50 for SM 5.0.\n"
|
||||||
|
"\t[--flatten-ubo]:\n\t\tEmit UBOs as plain uniform arrays.\n"
|
||||||
|
"\t\tE.g.: uniform MyUBO { vec4 a; float b, c, d, e; }; will be emitted as uniform float4 MyUBO[2];\n"
|
||||||
|
"\t\tCaveat: You cannot mix and match floating-point and integer in the same UBO with this option.\n"
|
||||||
"\t[--hlsl-enable-compat]:\n\t\tAllow point size and point coord to be used, even if they won't work as expected.\n"
|
"\t[--hlsl-enable-compat]:\n\t\tAllow point size and point coord to be used, even if they won't work as expected.\n"
|
||||||
"\t\tPointSize is ignored, and PointCoord returns (0.5, 0.5).\n"
|
"\t\tPointSize is ignored, and PointCoord returns (0.5, 0.5).\n"
|
||||||
"\t[--hlsl-support-nonzero-basevertex-baseinstance]:\n\t\tSupport base vertex and base instance by emitting a special cbuffer declared as:\n"
|
"\t[--hlsl-support-nonzero-basevertex-baseinstance]:\n\t\tSupport base vertex and base instance by emitting a special cbuffer declared as:\n"
|
||||||
@@ -913,6 +926,7 @@ static void print_help_common()
|
|||||||
"\t[--mask-stage-output-builtin <Position|PointSize|ClipDistance|CullDistance>]:\n"
|
"\t[--mask-stage-output-builtin <Position|PointSize|ClipDistance|CullDistance>]:\n"
|
||||||
"\t\tIf a stage output variable with matching builtin is active, "
|
"\t\tIf a stage output variable with matching builtin is active, "
|
||||||
"optimize away the variable if it can affect cross-stage linking correctness.\n"
|
"optimize away the variable if it can affect cross-stage linking correctness.\n"
|
||||||
|
"\t[--relax-nan-checks]:\n\t\tRelax NaN checks for N{Clamp,Min,Max} and ordered vs. unordered compare instructions.\n"
|
||||||
);
|
);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
@@ -930,6 +944,8 @@ static void print_help_obscure()
|
|||||||
"\t\tdo not attempt to analyze usage, and always emit read/write state.\n"
|
"\t\tdo not attempt to analyze usage, and always emit read/write state.\n"
|
||||||
"\t[--flatten-multidimensional-arrays]:\n\t\tDo not support multi-dimensional arrays and flatten them to one dimension.\n"
|
"\t[--flatten-multidimensional-arrays]:\n\t\tDo not support multi-dimensional arrays and flatten them to one dimension.\n"
|
||||||
"\t[--cpp-interface-name <name>]:\n\t\tEmit a specific class name in C++ codegen.\n"
|
"\t[--cpp-interface-name <name>]:\n\t\tEmit a specific class name in C++ codegen.\n"
|
||||||
|
"\t[--force-recompile-max-debug-iterations <count>]:\n\t\tAllow compilation loop to run for N loops.\n"
|
||||||
|
"\t\tCan be used to triage workarounds, but should not be used as a crutch, since it masks an implementation bug.\n"
|
||||||
);
|
);
|
||||||
// clang-format on
|
// clang-format on
|
||||||
}
|
}
|
||||||
@@ -1081,7 +1097,7 @@ static HLSLBindingFlags hlsl_resource_type_to_flag(const std::string &arg)
|
|||||||
|
|
||||||
static string compile_iteration(const CLIArguments &args, std::vector<uint32_t> spirv_file)
|
static string compile_iteration(const CLIArguments &args, std::vector<uint32_t> spirv_file)
|
||||||
{
|
{
|
||||||
Parser spirv_parser(move(spirv_file));
|
Parser spirv_parser(std::move(spirv_file));
|
||||||
spirv_parser.parse();
|
spirv_parser.parse();
|
||||||
|
|
||||||
unique_ptr<CompilerGLSL> compiler;
|
unique_ptr<CompilerGLSL> compiler;
|
||||||
@@ -1090,13 +1106,13 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
|
|
||||||
if (args.cpp)
|
if (args.cpp)
|
||||||
{
|
{
|
||||||
compiler.reset(new CompilerCPP(move(spirv_parser.get_parsed_ir())));
|
compiler.reset(new CompilerCPP(std::move(spirv_parser.get_parsed_ir())));
|
||||||
if (args.cpp_interface_name)
|
if (args.cpp_interface_name)
|
||||||
static_cast<CompilerCPP *>(compiler.get())->set_interface_name(args.cpp_interface_name);
|
static_cast<CompilerCPP *>(compiler.get())->set_interface_name(args.cpp_interface_name);
|
||||||
}
|
}
|
||||||
else if (args.msl)
|
else if (args.msl)
|
||||||
{
|
{
|
||||||
compiler.reset(new CompilerMSL(move(spirv_parser.get_parsed_ir())));
|
compiler.reset(new CompilerMSL(std::move(spirv_parser.get_parsed_ir())));
|
||||||
|
|
||||||
auto *msl_comp = static_cast<CompilerMSL *>(compiler.get());
|
auto *msl_comp = static_cast<CompilerMSL *>(compiler.get());
|
||||||
auto msl_opts = msl_comp->get_msl_options();
|
auto msl_opts = msl_comp->get_msl_options();
|
||||||
@@ -1137,6 +1153,7 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
msl_opts.emulate_subgroups = args.msl_emulate_subgroups;
|
msl_opts.emulate_subgroups = args.msl_emulate_subgroups;
|
||||||
msl_opts.fixed_subgroup_size = args.msl_fixed_subgroup_size;
|
msl_opts.fixed_subgroup_size = args.msl_fixed_subgroup_size;
|
||||||
msl_opts.force_sample_rate_shading = args.msl_force_sample_rate_shading;
|
msl_opts.force_sample_rate_shading = args.msl_force_sample_rate_shading;
|
||||||
|
msl_opts.ios_support_base_vertex_instance = true;
|
||||||
msl_comp->set_msl_options(msl_opts);
|
msl_comp->set_msl_options(msl_opts);
|
||||||
for (auto &v : args.msl_discrete_descriptor_sets)
|
for (auto &v : args.msl_discrete_descriptor_sets)
|
||||||
msl_comp->add_discrete_descriptor_set(v);
|
msl_comp->add_discrete_descriptor_set(v);
|
||||||
@@ -1153,13 +1170,13 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
msl_comp->set_combined_sampler_suffix(args.msl_combined_sampler_suffix);
|
msl_comp->set_combined_sampler_suffix(args.msl_combined_sampler_suffix);
|
||||||
}
|
}
|
||||||
else if (args.hlsl)
|
else if (args.hlsl)
|
||||||
compiler.reset(new CompilerHLSL(move(spirv_parser.get_parsed_ir())));
|
compiler.reset(new CompilerHLSL(std::move(spirv_parser.get_parsed_ir())));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
combined_image_samplers = !args.vulkan_semantics;
|
combined_image_samplers = !args.vulkan_semantics;
|
||||||
if (!args.vulkan_semantics || args.vulkan_glsl_disable_ext_samplerless_texture_functions)
|
if (!args.vulkan_semantics || args.vulkan_glsl_disable_ext_samplerless_texture_functions)
|
||||||
build_dummy_sampler = true;
|
build_dummy_sampler = true;
|
||||||
compiler.reset(new CompilerGLSL(move(spirv_parser.get_parsed_ir())));
|
compiler.reset(new CompilerGLSL(std::move(spirv_parser.get_parsed_ir())));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!args.variable_type_remaps.empty())
|
if (!args.variable_type_remaps.empty())
|
||||||
@@ -1170,7 +1187,7 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
out = remap.new_variable_type;
|
out = remap.new_variable_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
compiler->set_variable_type_remap_callback(move(remap_cb));
|
compiler->set_variable_type_remap_callback(std::move(remap_cb));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &masked : args.masked_stage_outputs)
|
for (auto &masked : args.masked_stage_outputs)
|
||||||
@@ -1279,9 +1296,12 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
opts.emit_push_constant_as_uniform_buffer = args.glsl_emit_push_constant_as_ubo;
|
opts.emit_push_constant_as_uniform_buffer = args.glsl_emit_push_constant_as_ubo;
|
||||||
opts.emit_uniform_buffer_as_plain_uniforms = args.glsl_emit_ubo_as_plain_uniforms;
|
opts.emit_uniform_buffer_as_plain_uniforms = args.glsl_emit_ubo_as_plain_uniforms;
|
||||||
opts.force_flattened_io_blocks = args.glsl_force_flattened_io_blocks;
|
opts.force_flattened_io_blocks = args.glsl_force_flattened_io_blocks;
|
||||||
|
opts.ovr_multiview_view_count = args.glsl_ovr_multiview_view_count;
|
||||||
opts.emit_line_directives = args.emit_line_directives;
|
opts.emit_line_directives = args.emit_line_directives;
|
||||||
opts.enable_storage_image_qualifier_deduction = args.enable_storage_image_qualifier_deduction;
|
opts.enable_storage_image_qualifier_deduction = args.enable_storage_image_qualifier_deduction;
|
||||||
opts.force_zero_initialized_variables = args.force_zero_initialized_variables;
|
opts.force_zero_initialized_variables = args.force_zero_initialized_variables;
|
||||||
|
opts.relax_nan_checks = args.relax_nan_checks;
|
||||||
|
opts.force_recompile_max_debug_iterations = args.force_recompile_max_debug_iterations;
|
||||||
compiler->set_common_options(opts);
|
compiler->set_common_options(opts);
|
||||||
|
|
||||||
for (auto &fetch : args.glsl_ext_framebuffer_fetch)
|
for (auto &fetch : args.glsl_ext_framebuffer_fetch)
|
||||||
@@ -1341,7 +1361,7 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
{
|
{
|
||||||
auto active = compiler->get_active_interface_variables();
|
auto active = compiler->get_active_interface_variables();
|
||||||
res = compiler->get_shader_resources(active);
|
res = compiler->get_shader_resources(active);
|
||||||
compiler->set_enabled_interface_variables(move(active));
|
compiler->set_enabled_interface_variables(std::move(active));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
res = compiler->get_shader_resources();
|
res = compiler->get_shader_resources();
|
||||||
@@ -1356,7 +1376,7 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
|
|
||||||
auto pls_inputs = remap_pls(args.pls_in, res.stage_inputs, &res.subpass_inputs);
|
auto pls_inputs = remap_pls(args.pls_in, res.stage_inputs, &res.subpass_inputs);
|
||||||
auto pls_outputs = remap_pls(args.pls_out, res.stage_outputs, nullptr);
|
auto pls_outputs = remap_pls(args.pls_out, res.stage_outputs, nullptr);
|
||||||
compiler->remap_pixel_local_storage(move(pls_inputs), move(pls_outputs));
|
compiler->remap_pixel_local_storage(std::move(pls_inputs), std::move(pls_outputs));
|
||||||
|
|
||||||
for (auto &ext : args.extensions)
|
for (auto &ext : args.extensions)
|
||||||
compiler->require_extension(ext);
|
compiler->require_extension(ext);
|
||||||
@@ -1403,12 +1423,7 @@ static string compile_iteration(const CLIArguments &args, std::vector<uint32_t>
|
|||||||
if (args.hlsl)
|
if (args.hlsl)
|
||||||
{
|
{
|
||||||
auto *hlsl_compiler = static_cast<CompilerHLSL *>(compiler.get());
|
auto *hlsl_compiler = static_cast<CompilerHLSL *>(compiler.get());
|
||||||
uint32_t new_builtin = hlsl_compiler->remap_num_workgroups_builtin();
|
hlsl_compiler->remap_num_workgroups_builtin();
|
||||||
if (new_builtin)
|
|
||||||
{
|
|
||||||
hlsl_compiler->set_decoration(new_builtin, DecorationDescriptorSet, 0);
|
|
||||||
hlsl_compiler->set_decoration(new_builtin, DecorationBinding, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.hlsl)
|
if (args.hlsl)
|
||||||
@@ -1470,6 +1485,7 @@ static int main_inner(int argc, char *argv[])
|
|||||||
cbs.add("--glsl-emit-push-constant-as-ubo", [&args](CLIParser &) { args.glsl_emit_push_constant_as_ubo = true; });
|
cbs.add("--glsl-emit-push-constant-as-ubo", [&args](CLIParser &) { args.glsl_emit_push_constant_as_ubo = true; });
|
||||||
cbs.add("--glsl-emit-ubo-as-plain-uniforms", [&args](CLIParser &) { args.glsl_emit_ubo_as_plain_uniforms = true; });
|
cbs.add("--glsl-emit-ubo-as-plain-uniforms", [&args](CLIParser &) { args.glsl_emit_ubo_as_plain_uniforms = true; });
|
||||||
cbs.add("--glsl-force-flattened-io-blocks", [&args](CLIParser &) { args.glsl_force_flattened_io_blocks = true; });
|
cbs.add("--glsl-force-flattened-io-blocks", [&args](CLIParser &) { args.glsl_force_flattened_io_blocks = true; });
|
||||||
|
cbs.add("--glsl-ovr-multiview-view-count", [&args](CLIParser &parser) { args.glsl_ovr_multiview_view_count = parser.next_uint(); });
|
||||||
cbs.add("--glsl-remap-ext-framebuffer-fetch", [&args](CLIParser &parser) {
|
cbs.add("--glsl-remap-ext-framebuffer-fetch", [&args](CLIParser &parser) {
|
||||||
uint32_t input_index = parser.next_uint();
|
uint32_t input_index = parser.next_uint();
|
||||||
uint32_t color_attachment = parser.next_uint();
|
uint32_t color_attachment = parser.next_uint();
|
||||||
@@ -1589,7 +1605,7 @@ static int main_inner(int argc, char *argv[])
|
|||||||
auto old_name = parser.next_string();
|
auto old_name = parser.next_string();
|
||||||
auto new_name = parser.next_string();
|
auto new_name = parser.next_string();
|
||||||
auto model = stage_to_execution_model(parser.next_string());
|
auto model = stage_to_execution_model(parser.next_string());
|
||||||
args.entry_point_rename.push_back({ old_name, new_name, move(model) });
|
args.entry_point_rename.push_back({ old_name, new_name, std::move(model) });
|
||||||
});
|
});
|
||||||
cbs.add("--entry", [&args](CLIParser &parser) { args.entry = parser.next_string(); });
|
cbs.add("--entry", [&args](CLIParser &parser) { args.entry = parser.next_string(); });
|
||||||
cbs.add("--stage", [&args](CLIParser &parser) { args.entry_stage = parser.next_string(); });
|
cbs.add("--stage", [&args](CLIParser &parser) { args.entry_stage = parser.next_string(); });
|
||||||
@@ -1598,20 +1614,20 @@ static int main_inner(int argc, char *argv[])
|
|||||||
HLSLVertexAttributeRemap remap;
|
HLSLVertexAttributeRemap remap;
|
||||||
remap.location = parser.next_uint();
|
remap.location = parser.next_uint();
|
||||||
remap.semantic = parser.next_string();
|
remap.semantic = parser.next_string();
|
||||||
args.hlsl_attr_remap.push_back(move(remap));
|
args.hlsl_attr_remap.push_back(std::move(remap));
|
||||||
});
|
});
|
||||||
|
|
||||||
cbs.add("--remap", [&args](CLIParser &parser) {
|
cbs.add("--remap", [&args](CLIParser &parser) {
|
||||||
string src = parser.next_string();
|
string src = parser.next_string();
|
||||||
string dst = parser.next_string();
|
string dst = parser.next_string();
|
||||||
uint32_t components = parser.next_uint();
|
uint32_t components = parser.next_uint();
|
||||||
args.remaps.push_back({ move(src), move(dst), components });
|
args.remaps.push_back({ std::move(src), std::move(dst), components });
|
||||||
});
|
});
|
||||||
|
|
||||||
cbs.add("--remap-variable-type", [&args](CLIParser &parser) {
|
cbs.add("--remap-variable-type", [&args](CLIParser &parser) {
|
||||||
string var_name = parser.next_string();
|
string var_name = parser.next_string();
|
||||||
string new_type = parser.next_string();
|
string new_type = parser.next_string();
|
||||||
args.variable_type_remaps.push_back({ move(var_name), move(new_type) });
|
args.variable_type_remaps.push_back({ std::move(var_name), std::move(new_type) });
|
||||||
});
|
});
|
||||||
|
|
||||||
cbs.add("--rename-interface-variable", [&args](CLIParser &parser) {
|
cbs.add("--rename-interface-variable", [&args](CLIParser &parser) {
|
||||||
@@ -1624,18 +1640,18 @@ static int main_inner(int argc, char *argv[])
|
|||||||
|
|
||||||
uint32_t loc = parser.next_uint();
|
uint32_t loc = parser.next_uint();
|
||||||
string var_name = parser.next_string();
|
string var_name = parser.next_string();
|
||||||
args.interface_variable_renames.push_back({ cls, loc, move(var_name) });
|
args.interface_variable_renames.push_back({ cls, loc, std::move(var_name) });
|
||||||
});
|
});
|
||||||
|
|
||||||
cbs.add("--pls-in", [&args](CLIParser &parser) {
|
cbs.add("--pls-in", [&args](CLIParser &parser) {
|
||||||
auto fmt = pls_format(parser.next_string());
|
auto fmt = pls_format(parser.next_string());
|
||||||
auto name = parser.next_string();
|
auto name = parser.next_string();
|
||||||
args.pls_in.push_back({ move(fmt), move(name) });
|
args.pls_in.push_back({ std::move(fmt), std::move(name) });
|
||||||
});
|
});
|
||||||
cbs.add("--pls-out", [&args](CLIParser &parser) {
|
cbs.add("--pls-out", [&args](CLIParser &parser) {
|
||||||
auto fmt = pls_format(parser.next_string());
|
auto fmt = pls_format(parser.next_string());
|
||||||
auto name = parser.next_string();
|
auto name = parser.next_string();
|
||||||
args.pls_out.push_back({ move(fmt), move(name) });
|
args.pls_out.push_back({ std::move(fmt), std::move(name) });
|
||||||
});
|
});
|
||||||
cbs.add("--shader-model", [&args](CLIParser &parser) {
|
cbs.add("--shader-model", [&args](CLIParser &parser) {
|
||||||
args.shader_model = parser.next_uint();
|
args.shader_model = parser.next_uint();
|
||||||
@@ -1678,11 +1694,17 @@ static int main_inner(int argc, char *argv[])
|
|||||||
args.masked_stage_builtins.push_back(masked_builtin);
|
args.masked_stage_builtins.push_back(masked_builtin);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
cbs.add("--force-recompile-max-debug-iterations", [&](CLIParser &parser) {
|
||||||
|
args.force_recompile_max_debug_iterations = parser.next_uint();
|
||||||
|
});
|
||||||
|
|
||||||
|
cbs.add("--relax-nan-checks", [&](CLIParser &) { args.relax_nan_checks = true; });
|
||||||
|
|
||||||
cbs.default_handler = [&args](const char *value) { args.input = value; };
|
cbs.default_handler = [&args](const char *value) { args.input = value; };
|
||||||
cbs.add("-", [&args](CLIParser &) { args.input = "-"; });
|
cbs.add("-", [&args](CLIParser &) { args.input = "-"; });
|
||||||
cbs.error_handler = [] { print_help(); };
|
cbs.error_handler = [] { print_help(); };
|
||||||
|
|
||||||
CLIParser parser{ move(cbs), argc - 1, argv + 1 };
|
CLIParser parser{ std::move(cbs), argc - 1, argv + 1 };
|
||||||
if (!parser.parse())
|
if (!parser.parse())
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
else if (parser.ended_state)
|
else if (parser.ended_state)
|
||||||
@@ -1702,10 +1724,10 @@ static int main_inner(int argc, char *argv[])
|
|||||||
// Special case reflection because it has little to do with the path followed by code-outputting compilers
|
// Special case reflection because it has little to do with the path followed by code-outputting compilers
|
||||||
if (!args.reflect.empty())
|
if (!args.reflect.empty())
|
||||||
{
|
{
|
||||||
Parser spirv_parser(move(spirv_file));
|
Parser spirv_parser(std::move(spirv_file));
|
||||||
spirv_parser.parse();
|
spirv_parser.parse();
|
||||||
|
|
||||||
CompilerReflection compiler(move(spirv_parser.get_parsed_ir()));
|
CompilerReflection compiler(std::move(spirv_parser.get_parsed_ir()));
|
||||||
compiler.set_format(args.reflect);
|
compiler.set_format(args.reflect);
|
||||||
auto json = compiler.compile();
|
auto json = compiler.compile();
|
||||||
if (args.output)
|
if (args.output)
|
||||||
@@ -1718,7 +1740,7 @@ static int main_inner(int argc, char *argv[])
|
|||||||
string compiled_output;
|
string compiled_output;
|
||||||
|
|
||||||
if (args.iterations == 1)
|
if (args.iterations == 1)
|
||||||
compiled_output = compile_iteration(args, move(spirv_file));
|
compiled_output = compile_iteration(args, std::move(spirv_file));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < args.iterations; i++)
|
for (unsigned i = 0; i < args.iterations; i++)
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright 2020-2021 Hans-Kristian Arntzen
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
prefix=@CMAKE_INSTALL_PREFIX@
|
prefix=@CMAKE_INSTALL_PREFIX@
|
||||||
exec_prefix=${prefix}
|
exec_prefix=${prefix}
|
||||||
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
|
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
|
||||||
|
|||||||
+8
-16
@@ -3,22 +3,14 @@ RWByteAddressBuffer _6 : register(u1);
|
|||||||
|
|
||||||
void comp_main()
|
void comp_main()
|
||||||
{
|
{
|
||||||
bool4 _31 = bool4(int(_5.Load4(16).x) < int4(_5.Load4(0)).x, int(_5.Load4(16).y) < int4(_5.Load4(0)).y, int(_5.Load4(16).z) < int4(_5.Load4(0)).z, int(_5.Load4(16).w) < int4(_5.Load4(0)).w);
|
_6.Store4(0, uint4(bool4(int(_5.Load4(16).x) < int4(_5.Load4(0)).x, int(_5.Load4(16).y) < int4(_5.Load4(0)).y, int(_5.Load4(16).z) < int4(_5.Load4(0)).z, int(_5.Load4(16).w) < int4(_5.Load4(0)).w)));
|
||||||
bool4 _32 = bool4(int(_5.Load4(16).x) <= int4(_5.Load4(0)).x, int(_5.Load4(16).y) <= int4(_5.Load4(0)).y, int(_5.Load4(16).z) <= int4(_5.Load4(0)).z, int(_5.Load4(16).w) <= int4(_5.Load4(0)).w);
|
_6.Store4(0, uint4(bool4(int(_5.Load4(16).x) <= int4(_5.Load4(0)).x, int(_5.Load4(16).y) <= int4(_5.Load4(0)).y, int(_5.Load4(16).z) <= int4(_5.Load4(0)).z, int(_5.Load4(16).w) <= int4(_5.Load4(0)).w)));
|
||||||
bool4 _33 = bool4(_5.Load4(16).x < uint(int4(_5.Load4(0)).x), _5.Load4(16).y < uint(int4(_5.Load4(0)).y), _5.Load4(16).z < uint(int4(_5.Load4(0)).z), _5.Load4(16).w < uint(int4(_5.Load4(0)).w));
|
_6.Store4(0, uint4(bool4(_5.Load4(16).x < uint(int4(_5.Load4(0)).x), _5.Load4(16).y < uint(int4(_5.Load4(0)).y), _5.Load4(16).z < uint(int4(_5.Load4(0)).z), _5.Load4(16).w < uint(int4(_5.Load4(0)).w))));
|
||||||
bool4 _34 = bool4(_5.Load4(16).x <= uint(int4(_5.Load4(0)).x), _5.Load4(16).y <= uint(int4(_5.Load4(0)).y), _5.Load4(16).z <= uint(int4(_5.Load4(0)).z), _5.Load4(16).w <= uint(int4(_5.Load4(0)).w));
|
_6.Store4(0, uint4(bool4(_5.Load4(16).x <= uint(int4(_5.Load4(0)).x), _5.Load4(16).y <= uint(int4(_5.Load4(0)).y), _5.Load4(16).z <= uint(int4(_5.Load4(0)).z), _5.Load4(16).w <= uint(int4(_5.Load4(0)).w))));
|
||||||
bool4 _35 = bool4(int(_5.Load4(16).x) > int4(_5.Load4(0)).x, int(_5.Load4(16).y) > int4(_5.Load4(0)).y, int(_5.Load4(16).z) > int4(_5.Load4(0)).z, int(_5.Load4(16).w) > int4(_5.Load4(0)).w);
|
_6.Store4(0, uint4(bool4(int(_5.Load4(16).x) > int4(_5.Load4(0)).x, int(_5.Load4(16).y) > int4(_5.Load4(0)).y, int(_5.Load4(16).z) > int4(_5.Load4(0)).z, int(_5.Load4(16).w) > int4(_5.Load4(0)).w)));
|
||||||
bool4 _36 = bool4(int(_5.Load4(16).x) >= int4(_5.Load4(0)).x, int(_5.Load4(16).y) >= int4(_5.Load4(0)).y, int(_5.Load4(16).z) >= int4(_5.Load4(0)).z, int(_5.Load4(16).w) >= int4(_5.Load4(0)).w);
|
_6.Store4(0, uint4(bool4(int(_5.Load4(16).x) >= int4(_5.Load4(0)).x, int(_5.Load4(16).y) >= int4(_5.Load4(0)).y, int(_5.Load4(16).z) >= int4(_5.Load4(0)).z, int(_5.Load4(16).w) >= int4(_5.Load4(0)).w)));
|
||||||
bool4 _37 = bool4(_5.Load4(16).x > uint(int4(_5.Load4(0)).x), _5.Load4(16).y > uint(int4(_5.Load4(0)).y), _5.Load4(16).z > uint(int4(_5.Load4(0)).z), _5.Load4(16).w > uint(int4(_5.Load4(0)).w));
|
_6.Store4(0, uint4(bool4(_5.Load4(16).x > uint(int4(_5.Load4(0)).x), _5.Load4(16).y > uint(int4(_5.Load4(0)).y), _5.Load4(16).z > uint(int4(_5.Load4(0)).z), _5.Load4(16).w > uint(int4(_5.Load4(0)).w))));
|
||||||
bool4 _38 = bool4(_5.Load4(16).x >= uint(int4(_5.Load4(0)).x), _5.Load4(16).y >= uint(int4(_5.Load4(0)).y), _5.Load4(16).z >= uint(int4(_5.Load4(0)).z), _5.Load4(16).w >= uint(int4(_5.Load4(0)).w));
|
_6.Store4(0, uint4(bool4(_5.Load4(16).x >= uint(int4(_5.Load4(0)).x), _5.Load4(16).y >= uint(int4(_5.Load4(0)).y), _5.Load4(16).z >= uint(int4(_5.Load4(0)).z), _5.Load4(16).w >= uint(int4(_5.Load4(0)).w))));
|
||||||
_6.Store4(0, uint4(_31.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _31.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _31.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _31.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
_6.Store4(0, uint4(_32.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _32.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _32.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _32.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
_6.Store4(0, uint4(_33.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _33.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _33.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _33.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
_6.Store4(0, uint4(_34.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _34.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _34.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _34.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
_6.Store4(0, uint4(_35.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _35.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _35.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _35.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
_6.Store4(0, uint4(_36.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _36.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _36.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _36.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
_6.Store4(0, uint4(_37.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _37.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _37.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _37.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
_6.Store4(0, uint4(_38.x ? uint4(1u, 1u, 1u, 1u).x : uint4(0u, 0u, 0u, 0u).x, _38.y ? uint4(1u, 1u, 1u, 1u).y : uint4(0u, 0u, 0u, 0u).y, _38.z ? uint4(1u, 1u, 1u, 1u).z : uint4(0u, 0u, 0u, 0u).z, _38.w ? uint4(1u, 1u, 1u, 1u).w : uint4(0u, 0u, 0u, 0u).w));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
|
|||||||
Vendored
+30
@@ -0,0 +1,30 @@
|
|||||||
|
RWByteAddressBuffer _4 : register(u0);
|
||||||
|
|
||||||
|
void comp_main()
|
||||||
|
{
|
||||||
|
_4.Store(0, asuint(min(asfloat(_4.Load(48)), asfloat(_4.Load(96)))));
|
||||||
|
_4.Store2(8, asuint(min(asfloat(_4.Load2(56)), asfloat(_4.Load2(104)))));
|
||||||
|
_4.Store3(16, asuint(min(asfloat(_4.Load3(64)), asfloat(_4.Load3(112)))));
|
||||||
|
_4.Store4(32, asuint(min(asfloat(_4.Load4(80)), asfloat(_4.Load4(128)))));
|
||||||
|
_4.Store(0, asuint(max(asfloat(_4.Load(48)), asfloat(_4.Load(96)))));
|
||||||
|
_4.Store2(8, asuint(max(asfloat(_4.Load2(56)), asfloat(_4.Load2(104)))));
|
||||||
|
_4.Store3(16, asuint(max(asfloat(_4.Load3(64)), asfloat(_4.Load3(112)))));
|
||||||
|
_4.Store4(32, asuint(max(asfloat(_4.Load4(80)), asfloat(_4.Load4(128)))));
|
||||||
|
_4.Store(0, asuint(clamp(asfloat(_4.Load(0)), asfloat(_4.Load(48)), asfloat(_4.Load(96)))));
|
||||||
|
_4.Store2(8, asuint(clamp(asfloat(_4.Load2(8)), asfloat(_4.Load2(56)), asfloat(_4.Load2(104)))));
|
||||||
|
_4.Store3(16, asuint(clamp(asfloat(_4.Load3(16)), asfloat(_4.Load3(64)), asfloat(_4.Load3(112)))));
|
||||||
|
_4.Store4(32, asuint(clamp(asfloat(_4.Load4(32)), asfloat(_4.Load4(80)), asfloat(_4.Load4(128)))));
|
||||||
|
for (int _139 = 0; _139 < 2; )
|
||||||
|
{
|
||||||
|
_4.Store2(8, asuint(min(asfloat(_4.Load2(56)), asfloat(_4.Load2(104)))));
|
||||||
|
_4.Store(0, asuint(clamp(asfloat(_4.Load(0)), asfloat(_4.Load(56)), asfloat(_4.Load(60)))));
|
||||||
|
_139++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[numthreads(1, 1, 1)]
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
comp_main();
|
||||||
|
}
|
||||||
+1
-1
@@ -7,7 +7,7 @@ struct SPIRV_Cross_Output
|
|||||||
|
|
||||||
void frag_main()
|
void frag_main()
|
||||||
{
|
{
|
||||||
FragColor = float3(asfloat(0x7f800000u), asfloat(0xff800000u), asfloat(0x7fc00000u));
|
FragColor = float3(asfloat(0x7f800000u /* inf */), asfloat(0xff800000u /* -inf */), asfloat(0x7fc00000u /* nan */));
|
||||||
}
|
}
|
||||||
|
|
||||||
SPIRV_Cross_Output main()
|
SPIRV_Cross_Output main()
|
||||||
|
|||||||
-2
@@ -69,8 +69,6 @@ void frag_main()
|
|||||||
{
|
{
|
||||||
#line 42 "test.frag"
|
#line 42 "test.frag"
|
||||||
FragColor += (10.0f + vColor);
|
FragColor += (10.0f + vColor);
|
||||||
#line 43 "test.frag"
|
|
||||||
#line 42 "test.frag"
|
|
||||||
#line 43 "test.frag"
|
#line 43 "test.frag"
|
||||||
if (FragColor < 100.0f)
|
if (FragColor < 100.0f)
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-14
@@ -5,22 +5,9 @@ struct SPIRV_Cross_Output
|
|||||||
float4 FragColor : SV_Target0;
|
float4 FragColor : SV_Target0;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint64_t spvPackUint2x32(uint2 value)
|
|
||||||
{
|
|
||||||
return (uint64_t(value.y) << 32) | uint64_t(value.x);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint2 spvUnpackUint2x32(uint64_t value)
|
|
||||||
{
|
|
||||||
uint2 Unpacked;
|
|
||||||
Unpacked.x = uint(value & 0xffffffff);
|
|
||||||
Unpacked.y = uint(value >> 32);
|
|
||||||
return Unpacked;
|
|
||||||
}
|
|
||||||
|
|
||||||
void frag_main()
|
void frag_main()
|
||||||
{
|
{
|
||||||
uint2 unpacked = spvUnpackUint2x32(spvPackUint2x32(uint2(18u, 52u)));
|
uint2 unpacked = uint2(18u, 52u);
|
||||||
FragColor = float4(float(unpacked.x), float(unpacked.y), 1.0f, 1.0f);
|
FragColor = float4(float(unpacked.x), float(unpacked.y), 1.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-4
@@ -8,10 +8,7 @@ static const int _20 = (_7 + 2);
|
|||||||
#endif
|
#endif
|
||||||
static const uint _8 = SPIRV_CROSS_CONSTANT_ID_202;
|
static const uint _8 = SPIRV_CROSS_CONSTANT_ID_202;
|
||||||
static const uint _25 = (_8 % 5u);
|
static const uint _25 = (_8 % 5u);
|
||||||
#ifndef SPIRV_CROSS_CONSTANT_ID_0
|
static const int4 _30 = int4(20, 30, _20, _20);
|
||||||
#define SPIRV_CROSS_CONSTANT_ID_0 int4(20, 30, _20, _20)
|
|
||||||
#endif
|
|
||||||
static const int4 _30 = SPIRV_CROSS_CONSTANT_ID_0;
|
|
||||||
static const int2 _32 = int2(_30.y, _30.x);
|
static const int2 _32 = int2(_30.y, _30.x);
|
||||||
static const int _33 = _30.y;
|
static const int _33 = _30.y;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
static const uint3 gl_WorkGroupSize = uint3(1u, 1u, 1u);
|
static const uint3 gl_WorkGroupSize = uint3(1u, 1u, 1u);
|
||||||
|
|
||||||
RWByteAddressBuffer _10 : register(u0);
|
RWByteAddressBuffer _10 : register(u0);
|
||||||
cbuffer SPIRV_Cross_NumWorkgroups : register(b0)
|
cbuffer SPIRV_Cross_NumWorkgroups
|
||||||
{
|
{
|
||||||
uint3 SPIRV_Cross_NumWorkgroups_1_count : packoffset(c0);
|
uint3 SPIRV_Cross_NumWorkgroups_1_count : packoffset(c0);
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
static const uint3 gl_WorkGroupSize = uint3(1u, 1u, 1u);
|
static const uint3 gl_WorkGroupSize = uint3(1u, 1u, 1u);
|
||||||
|
|
||||||
RWByteAddressBuffer _10 : register(u0);
|
RWByteAddressBuffer _10 : register(u0);
|
||||||
cbuffer SPIRV_Cross_NumWorkgroups : register(b0)
|
cbuffer SPIRV_Cross_NumWorkgroups
|
||||||
{
|
{
|
||||||
uint3 SPIRV_Cross_NumWorkgroups_1_count : packoffset(c0);
|
uint3 SPIRV_Cross_NumWorkgroups_1_count : packoffset(c0);
|
||||||
};
|
};
|
||||||
|
|||||||
+242
@@ -0,0 +1,242 @@
|
|||||||
|
RWByteAddressBuffer _17 : register(u0);
|
||||||
|
uniform RaytracingAccelerationStructure rtas : register(t1);
|
||||||
|
|
||||||
|
static RayQuery<RAY_FLAG_NONE> rayQuery;
|
||||||
|
|
||||||
|
static float3x4 _362;
|
||||||
|
static float4x3 _364;
|
||||||
|
|
||||||
|
void comp_main()
|
||||||
|
{
|
||||||
|
RayDesc _1ident = {0.0f.xxx, 0.0f, float3(1.0f, 0.0f, 0.0f), 9999.0f};
|
||||||
|
rayQuery.TraceRayInline(rtas, 0u, 255u, _1ident);
|
||||||
|
float3x4 _361;
|
||||||
|
float4x3 _363;
|
||||||
|
_363 = _364;
|
||||||
|
_361 = _362;
|
||||||
|
float3x4 _387;
|
||||||
|
float4x3 _398;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
bool _67 = rayQuery.Proceed();
|
||||||
|
if (_67)
|
||||||
|
{
|
||||||
|
uint _71 = rayQuery.CandidateType();
|
||||||
|
switch (_71)
|
||||||
|
{
|
||||||
|
case 0u:
|
||||||
|
{
|
||||||
|
rayQuery.Abort();
|
||||||
|
float4x3 _79 = rayQuery.CandidateObjectToWorld4x3();
|
||||||
|
rayQuery.CommitNonOpaqueTriangleHit();
|
||||||
|
bool _87 = rayQuery.CommittedTriangleFrontFace();
|
||||||
|
if (_87)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float2 _92 = rayQuery.CommittedTriangleBarycentrics();
|
||||||
|
if (_92.x == 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
int _98 = rayQuery.CommittedInstanceID();
|
||||||
|
if (_98 > 0)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
int _103 = rayQuery.CommittedInstanceIndex();
|
||||||
|
if (_103 > 0)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float3 _108 = rayQuery.CommittedObjectRayDirection();
|
||||||
|
if (_108.x > 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float3 _114 = rayQuery.CommittedObjectRayOrigin();
|
||||||
|
if (_114.x > 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
int _120 = rayQuery.CommittedPrimitiveIndex();
|
||||||
|
if (_120 > 0)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float _125 = rayQuery.CommittedRayT();
|
||||||
|
if (_125 > 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
uint _130 = rayQuery.CommittedInstanceContributionToHitGroupIndex();
|
||||||
|
if (_130 > 0u)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
_398 = _79;
|
||||||
|
_387 = transpose(_79);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1u:
|
||||||
|
{
|
||||||
|
float4x3 _136 = rayQuery.CandidateObjectToWorld4x3();
|
||||||
|
bool _139 = rayQuery.CandidateProceduralPrimitiveNonOpaque();
|
||||||
|
if (_139)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
rayQuery.CommitProceduralPrimitiveHit(144);
|
||||||
|
rayQuery.Abort();
|
||||||
|
_398 = _136;
|
||||||
|
_387 = transpose(_136);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
_398 = _363;
|
||||||
|
_387 = _361;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_363 = _398;
|
||||||
|
_361 = _387;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_361[0].x == _363[0].x)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
uint _157 = rayQuery.CommittedStatus();
|
||||||
|
float3x4 _365;
|
||||||
|
float4x3 _376;
|
||||||
|
switch (_157)
|
||||||
|
{
|
||||||
|
case 0u:
|
||||||
|
{
|
||||||
|
float4x3 _163 = rayQuery.CandidateWorldToObject4x3();
|
||||||
|
_376 = _163;
|
||||||
|
_365 = transpose(_163);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1u:
|
||||||
|
{
|
||||||
|
float4x3 _167 = rayQuery.CommittedWorldToObject4x3();
|
||||||
|
bool _170 = rayQuery.CommittedTriangleFrontFace();
|
||||||
|
if (_170)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float2 _174 = rayQuery.CommittedTriangleBarycentrics();
|
||||||
|
if (_174.y == 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
_376 = _167;
|
||||||
|
_365 = transpose(_167);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2u:
|
||||||
|
{
|
||||||
|
int _182 = rayQuery.CommittedGeometryIndex();
|
||||||
|
if (_182 > 0)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
int _187 = rayQuery.CommittedInstanceIndex();
|
||||||
|
if (_187 > 0)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
int _192 = rayQuery.CommittedInstanceID();
|
||||||
|
if (_192 > 0)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float3 _197 = rayQuery.CommittedObjectRayDirection();
|
||||||
|
if (_197.z > 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float3 _204 = rayQuery.CommittedObjectRayOrigin();
|
||||||
|
if (_204.x > 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
int _210 = rayQuery.CommittedPrimitiveIndex();
|
||||||
|
if (_210 > 0)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float _215 = rayQuery.CommittedRayT();
|
||||||
|
if (_215 > 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
_376 = _363;
|
||||||
|
_365 = _361;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
_376 = _363;
|
||||||
|
_365 = _361;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_365[0].x == _376[0].x)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
uint _230 = rayQuery.RayFlags();
|
||||||
|
if (_230 > 256u)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float _236 = rayQuery.RayTMin();
|
||||||
|
if (_236 > 0.0f)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
float3 _242 = rayQuery.WorldRayOrigin();
|
||||||
|
float3 _244 = rayQuery.WorldRayDirection();
|
||||||
|
if (_242.x == _244.z)
|
||||||
|
{
|
||||||
|
_17.Store(0, 0u);
|
||||||
|
_17.Store(4, 0u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[numthreads(1, 1, 1)]
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
comp_main();
|
||||||
|
}
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
uniform float4 UBO[56];
|
||||||
|
|
||||||
|
static float4 gl_Position;
|
||||||
|
static float4 aVertex;
|
||||||
|
|
||||||
|
struct SPIRV_Cross_Input
|
||||||
|
{
|
||||||
|
float4 aVertex : TEXCOORD0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SPIRV_Cross_Output
|
||||||
|
{
|
||||||
|
float4 gl_Position : SV_Position;
|
||||||
|
};
|
||||||
|
|
||||||
|
void vert_main()
|
||||||
|
{
|
||||||
|
gl_Position = (mul(aVertex, float4x4(UBO[40], UBO[41], UBO[42], UBO[43])) + UBO[55]) + ((UBO[50] + UBO[45]) + UBO[54].x.xxxx);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
|
||||||
|
{
|
||||||
|
aVertex = stage_input.aVertex;
|
||||||
|
vert_main();
|
||||||
|
SPIRV_Cross_Output stage_output;
|
||||||
|
stage_output.gl_Position = gl_Position;
|
||||||
|
return stage_output;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user