tag | 35fdea9fc21b2e89ca17c72db9a7c1ac42f80eb2 | |
---|---|---|
tagger | The Android Open Source Project <initial-contribution@android.com> | Mon Jul 30 12:19:34 2018 -0700 |
object | 28bda583e8f8e09d8747cfee019cf38c7a8a91e9 |
NDK Release 17
commit | 28bda583e8f8e09d8747cfee019cf38c7a8a91e9 | [log] [tgz] |
---|---|---|
author | David Neto <dneto@google.com> | Tue Oct 24 17:08:13 2017 -0400 |
committer | David Neto <dneto@google.com> | Tue Oct 24 17:10:30 2017 -0400 |
tree | df8136e629e8ae7b3d185dded0940fd1e5301313 | |
parent | 558db165d87ce0d32182b9586bba99340ba261e8 [diff] | |
parent | 90862fe4b1c6763b32ce683d2d32c2f281f577cf [diff] |
Merge remote-tracking branch 'aosp/upstream-master' into update-shaderc Includes: 90862fe Validate SpvOpVectorShuffle 13e6598 restrict opcodes targeting OpDecorationGroup 97990dc Fixed --eliminate-common-uniform so that it does not eliminate loads of volatile variables. 98072b7 Optimizer: Line and NoLine are not debug1 or debug2 cfd95f3 Refactored compression debugger 8d6e4db Run dead variable elimination when using -O and -Os e3a7209 DeadBranchElim: Fix dead block elimination 5834719 Add pass to remove dead variables at the module level. 2436794 Optimizer: OpModuleProcessed is in its own layout section 89b6af9 Add Android.mk build to Travis CI cfb711a Added dummy android test application d819f51 Fix cfg_cleanup.cpp. My bad. e6f3416 Remove coding redundancy in cfg_cleanup_pass.cpp a743c47 Add instruction_list to Android.mk 39e25fd Add validation pass for conversion instructions bb7802b Change BasicBlock to use InstructionList to hold instructions. ea9d1d0 Removed todos from validate_id.cpp 863578a DeadBranchElim: Slightly more defensive coding 8ec62de The reviewed cfg_cleanup optimize pass c75704e CFG cleanup pass - Remove unreachable blocks. f17326c Android.mk: add source/opt/fold.cpp 4101cf4 Merge pull request #885 from dnovillo/const-prop 332a1f1 Re-factor generic constant folding code out of FoldSpecConstantOpAndCompositePass 1a9061a ADCE: Treat privates like locals in entry point with no calls 1e7994c Opt: Move *NextId functionality into MemPass 941a234 Validator: Test OpReturnValue type check 8de8dd8 Reenable validate type unique pass 2401fc0 Refactored MARK-V API b54997e Validator checks OpReturn called from void func 720beb1 Generic intrusive linked list class. 63064bd DeadBranchElim: Add dead case elimination 99f2043 Add Android.mk to SPIRV-Tools c90d730 Add -O, -Os and -Oconfig flags. c26778f Set cmake-policy CMP0048 to NEW 86627f7 Implement Linker (module combiner) 4b1577a Remove duplicate dead branch elim pass declaration d7f199b Hack around bug in gcc-4.8.1 templates. da04f56 AggressiveDCE: Fix to not treat parameter memory refs as local c87e967 Compact-ids pass should update the header ID bound 169266e DiagnosticStream move ctor moves output duties to new object 17a843c Cache end iterators for speed 6526c42 No use to check OpBitCount result width d7ea99b Skip checking copyright if SPIRV_SKIP_TESTS is enabled 6eaaf7b Update CHANGES to reflect fix for #827 77feb8d Compact-ids pass should update instruction's result_id member 99cd25c Remove duplicated declaration of CreateAggressiveDCEPass(). 64d5e52 Add bitwise operations validator pass dcf4243 Add remaining opcodes to arithmetics validation d84df94 Update CHANGES with recent news e43c910 Create the dead function elimination pass 976e421 Detach MARK-V from the validator 16981f8 Avoid using global static variables c25b5be Add SPIRV_SPIRV_COMPRESSION option to cmake cf6c20e Merge pull request #829 from atgoo/fix_val_logicals 3f5e1a9 Validator: fix logicals pass for OpSelect pointers 33b879c elim-multi-store: only patch loop header phis that we created cf85ad1 Add validate logicals pass to the validator 4e3cc2f Refactored validate_aritmetics.cpp 9b14dd0 Updated markv_autogen 8be28f7 ElimLocalMultiStore: Reset structured successors for each function e4c7d8e Add strength reduction; for now replace multiply by power of 2 7be791a ExtractInsert: Handle rudimentary CompositeConstruct and ConstantComposite a91cecf Recognize SPV_AMD_shader_fragment_mask c6dfc11 Add new checks to validate arithmetics pass 4442102 Update CHANGES for OpModuleProcessed validation rule c843ef8 validator: OpModuleProcessed allowed in layout section 7c b36acbe Update MARK-V to version 1.01 40e9c60 spirv-as: Fail for unrecognized long option 25ddfec Inliner: Fix LoopMerge when inline into loop header of multi block loop 82df4bb Add validation pass for arithmetic operations 0d3b832 Make enums for all currently published extensions Test: checkbuild.py on Linux; unit tests on Windows Change-Id: Ia04ac3f73c2c5d8c41ba69992b1ee0a9b941c289
The SPIR-V Tools project provides an API and commands for processing SPIR-V modules.
The project includes an assembler, binary module parser, disassembler, validator, and optimizer for SPIR-V. Except for the optimizer, all are based on a common static library. The library contains all of the implementation details, and is used in the standalone tools whilst also enabling integration into other code bases directly. The optimizer implementation resides in its own library, which depends on the core library.
The interfaces have stabilized: We don't anticipate making a breaking change for existing features.
See projects.md
to see how we use the GitHub Project feature to organize planned and in-progress work.
SPIR-V is defined by the Khronos Group Inc. See the SPIR-V Registry for the SPIR-V specification, headers, and XML registry.
See CHANGES
for a high level summary of recent changes, by version.
SPIRV-Tools project version numbers are of the form v
year.
index and with an optional -dev
suffix to indicate work in progress. For exampe, the following versions are ordered from oldest to newest:
v2016.0
v2016.1-dev
v2016.1
v2016.2-dev
v2016.2
Use the --version
option on each command line tool to see the software version. An API call reports the software version as a C-style string.
OpConstant
, OpSpecConstant
, and OpSwitch
.See syntax.md
for the assembly language syntax.
The validator checks validation rules described by the SPIR-V specification.
Khronos recommends that tools that create or transform SPIR-V modules use the validator to ensure their outputs are valid, and that tools that consume SPIR-V modules optionally use the validator to protect themselves from bad inputs. This is especially encouraged for debug and development scenarios.
The validator has one-sided error: it will only return an error when it has implemented a rule check and the module violates that rule.
The validator is incomplete. See the CHANGES file for reports on completed work, and the Validator sub-project for planned and in-progress work.
Note: The validator checks some Universal Limits, from section 2.17 of the SPIR-V spec. The validator will fail on a module that exceeds those minimum upper bound limits. It is future work to parameterize the validator to allow larger limits accepted by a more than minimally capable SPIR-V consumer.
Note: The optimizer is still under development.
Currently supported optimizations:
OpSpecConstantOp
and OpSpecConstantComposite
For the latest list with detailed documentation, please refer to include/spirv-tools/optimizer.hpp
.
For suggestions on using the code reduction options, please refer to this white paper.
Note: The linker is still under development.
Current features:
See the CHANGES file for reports on completed work, and the General sub-project for planned and in-progress work.
spirv-tools-vimsyntax
generates file spvasm.vim
. Copy that file into your $HOME/.vim/syntax
directory to get SPIR-V assembly syntax highlighting in Vim. This build target is not built by default.The SPIR-V Tools are maintained by members of the The Khronos Group Inc., at https://github.com/KhronosGroup/SPIRV-Tools.
Contributions via merge request are welcome. Changes should:
clang-format
. Settings are defined by the included .clang-format file.We intend to maintain a linear history on the GitHub master
branch.
example
: demo code of using SPIRV-Tools APIsexternal/googletest
: Intended location for the googletest sources, not providedinclude/
: API clients should add this directory to the include search pathexternal/spirv-headers
: Intended location for SPIR-V headers, not providedinclude/spirv-tools/libspirv.h
: C API public interfacesource/
: API implementationtest/
: Tests, using the googletest frameworktools/
: Command line executablesThe project contains a number of tests, used to drive development and ensure correctness. The tests are written using the googletest framework. The googletest
source is not provided with this project. There are two ways to enable tests:
googletest
before configuring SPIR-V Tools.googletest
source into the <spirv-dir>/external/googletest
directory before configuring and building the project.Note: You must use a version of googletest that includes a fix for googletest issue 610. The fix is included on the googletest master branch any time after 2015-11-10. In particular, googletest must be newer than version 1.7.0.
The project uses CMake to generate platform-specific build configurations. Assume that <spirv-dir>
is the root directory of the checked out code:
cd <spirv-dir> git clone https://github.com/KhronosGroup/SPIRV-Headers.git external/spirv-headers git clone https://github.com/google/googletest.git external/googletest # optional mkdir build && cd build cmake [-G <platform-generator>] <spirv-dir>
Once the build files have been generated, build using your preferred development environment.
The following CMake options are supported:
SPIRV_COLOR_TERMINAL={ON|OFF}
, default ON
- Enables color console output.SPIRV_SKIP_TESTS={ON|OFF}
, default OFF
- Build only the library and the command line tools. This will prevent the tests from being built.SPIRV_SKIP_EXECUTABLES={ON|OFF}
, default OFF
- Build only the library, not the command line tools and tests.SPIRV_BUILD_COMPRESSION={ON|OFF}
, default OFF
- Build SPIR-V compressing codec.SPIRV_USE_SANITIZER=<sanitizer>
, default is no sanitizing - On UNIX platforms with an appropriate version of clang
this option enables the use of the sanitizers documented here. This should only be used with a debug build.SPIRV_WARN_EVERYTHING={ON|OFF}
, default OFF
- On UNIX platforms enable more strict warnings. The code might not compile with this option enabled. For Clang, enables -Weverything
. For GCC, enables -Wpedantic
. See CMakeLists.txt
for details.SPIRV_WERROR={ON|OFF}
, default ON
- Forces a compilation error on any warnings encountered by enabling the compiler-specific compiler front-end option.Additionally, you can pass additional C preprocessor definitions to SPIRV-Tools via setting SPIRV_TOOLS_EXTRA_DEFINITIONS
. For example, by setting it to /D_ITERATOR_DEBUG_LEVEL=0
on Windows, you can disable checked iterators and iterator debugging.
The internals of the library use C++11 features, and are exposed via both a C and C++ API.
In order to use the library from an application, the include path should point to <spirv-dir>/include
, which will enable the application to include the header <spirv-dir>/include/spirv-tools/libspirv.h{|pp}
then linking against the static library in <spirv-build-dir>/source/libSPIRV-Tools.a
or <spirv-build-dir>/source/SPIRV-Tools.lib
. For optimization, the header file is <spirv-dir>/include/spirv-tools/optimizer.hpp
, and the static library is <spirv-build-dir>/source/libSPIRV-Tools-opt.a
or <spirv-build-dir>/source/SPIRV-Tools-opt.lib
.
SPIRV-Tools
CMake target: Creates the static library:<spirv-build-dir>/source/libSPIRV-Tools.a
on Linux and OS X.<spirv-build-dir>/source/libSPIRV-Tools.lib
on Windows.SPIRV-Tools-opt
CMake target: Creates the static library:<spirv-build-dir>/source/libSPIRV-Tools-opt.a
on Linux and OS X.<spirv-build-dir>/source/libSPIRV-Tools-opt.lib
on Windows.The interfaces are still under development, and are expected to change.
There are five main entry points into the library in the C interface:
spvTextToBinary
: An assembler, translating text to a binary SPIR-V module.spvBinaryToText
: A disassembler, translating a binary SPIR-V module to text.spvBinaryParse
: The entry point to a binary parser API. It issues callbacks for the header and each parsed instruction. The disassembler is implemented as a client of spvBinaryParse
.spvValidate
implements the validator functionality. IncompletespvValidateBinary
implements the validator functionality. IncompleteThe C++ interface is comprised of three classes, SpirvTools
, Optimizer
and Linker
, all in the spvtools
namespace.
SpirvTools
provides Assemble
, Disassemble
, and Validate
methods.Optimizer
provides methods for registering and running optimization passes.Linker
provides methods for combining together multiple binaries.Command line tools, which wrap the above library functions, are provided to assemble or disassemble shader files. It's a convention to name SPIR-V assembly and binary files with suffix .spvasm
and .spv
, respectively.
The assembler reads the assembly language text, and emits the binary form.
The standalone assembler is the exectuable called spirv-as
, and is located in <spirv-build-dir>/tools/spirv-as
. The functionality of the assembler is implemented by the spvTextToBinary
library function.
spirv-as
- the standalone assembler<spirv-dir>/tools/as
Use option -h
to print help.
The disassembler reads the binary form, and emits assembly language text.
The standalone disassembler is the executable called spirv-dis
, and is located in <spirv-build-dir>/tools/spirv-dis
. The functionality of the disassembler is implemented by the spvBinaryToText
library function.
spirv-dis
- the standalone disassembler<spirv-dir>/tools/dis
Use option -h
to print help.
The output includes syntax colouring when printing to the standard output stream, on Linux, Windows, and OS X.
The linker combines multiple SPIR-V binary modules together, resulting in a single binary module as output.
This is a work in progress. The linker does not support OpenCL program linking options related to math flags. (See section 5.6.5.2 in OpenCL 1.2)
spirv-link
- the standalone linker<spirv-dir>/tools/link
The optimizer processes a SPIR-V binary module, applying transformations in the specified order.
This is a work in progress, with initially only few available transformations.
spirv-opt
- the standalone optimizer<spirv-dir>/tools/opt
Warning: This functionality is under development, and is incomplete.
The standalone validator is the executable called spirv-val
, and is located in <spirv-build-dir>/tools/spirv-val
. The functionality of the validator is implemented by the spvValidate
library function.
The validator operates on the binary form.
spirv-val
- the standalone validator<spirv-dir>/tools/val
The control flow dumper prints the control flow graph for a SPIR-V module as a GraphViz graph.
This is experimental.
spirv-cfg
- the control flow graph dumper<spirv-dir>/tools/cfg
spirv-lesspipe.sh
- Automatically disassembles .spv
binary files for the less
program, on compatible systems. For example, set the LESSOPEN
environment variable as follows, assuming both spirv-lesspipe.sh
and spirv-dis
are on your executable search path:
export LESSOPEN='| spirv-lesspipe.sh "%s"'
Then you page through a disassembled module as follows:
less foo.spv
spirv-lesspipe.sh
script will pass through any extra arguments to spirv-dis
. So, for example, you can turn off colours and friendly ID naming as follows:export LESSOPEN='| spirv-lesspipe.sh "%s" --no-color --raw-id'
vim-spirv - A vim plugin which supports automatic disassembly of .spv
files using the :edit
command and assembly using the :write
command. The plugin also provides additional features which include; syntax highlighting; highlighting of all ID's matching the ID under the cursor; and highlighting errors where the Instruction
operand of OpExtInst
is used without an appropriate OpExtInstImport
.
50spirv-tools.el
- Automatically disassembles ‘.spv’ binary files when loaded into the emacs text editor, and re-assembles them when saved, provided any modifications to the file are valid. This functionality must be explicitly requested by defining the symbol SPIRV_TOOLS_INSTALL_EMACS_HELPERS as follows:
cmake -DSPIRV_TOOLS_INSTALL_EMACS_HELPERS=true ...
In addition, this helper is only installed if the directory /etc/emacs/site-start.d exists, which is typically true if emacs is installed on the system.
Note that symbol IDs are not currently preserved through a load/edit/save operation. This may change if the ability is added to spirv-as.
Tests are only built when googletest is found. Use ctest
to run all the tests.
See the projects pages for more information.
OpLabel
instructions with that basic block's predecessors.This is a work in progress.
Full license terms are in LICENSE
Copyright (c) 2015-2016 The Khronos Group Inc. 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.