ndk-r17-beta2
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
tree: df8136e629e8ae7b3d185dded0940fd1e5301313
  1. android_test/
  2. examples/
  3. external/
  4. include/
  5. source/
  6. test/
  7. tools/
  8. utils/
  9. .appveyor.yml
  10. .clang-format
  11. .gitignore
  12. .travis.yml
  13. Android.mk
  14. CHANGES
  15. CMakeLists.txt
  16. LICENSE
  17. projects.md
  18. README.md
  19. syntax.md
README.md

SPIR-V Tools

Build Status Build status

Overview

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.

Verisoning SPIRV-Tools

See CHANGES for a high level summary of recent changes, by version.

SPIRV-Tools project version numbers are of the form vyear.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.

Supported features

Assembler, binary parser, and disassembler

  • Support for SPIR-V 1.0, 1.1, 1.2
    • Based on SPIR-V syntax described by JSON grammar files in the SPIRV-Headers repository.
  • Support for extended instruction sets:
    • GLSL std450 version 1.0 Rev 3
    • OpenCL version 1.0 Rev 2
  • Assembler only does basic syntax checking. No cross validation of IDs or types is performed, except to check literal arguments to OpConstant, OpSpecConstant, and OpSwitch.

See syntax.md for the assembly language syntax.

Validator

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.

Optimizer

Note: The optimizer is still under development.

Currently supported optimizations:

  • General
    • Strip debug info
  • Specialization Constants
    • Set spec constant default value
    • Freeze spec constant
    • Fold OpSpecConstantOp and OpSpecConstantComposite
    • Unify constants
    • Eliminate dead constant
  • Code Reduction
    • Inline all function calls exhaustively
    • Convert local access chains to inserts/extracts
    • Eliminate local load/store in single block
    • Eliminate local load/store with single store
    • Eliminate local load/store with multiple stores
    • Eliminate local extract from insert
    • Eliminate dead instructions (aggressive)
    • Eliminate dead branches
    • Merge single successor / single predecessor block pairs
    • Eliminate common uniform loads
    • Remove duplicates: Capabilities, extended instruction imports, types, and decorations.

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.

Linker

Note: The linker is still under development.

Current features:

  • Combine multiple SPIR-V binary modules together.
  • Combine into a library (exports are retained) or an executable (no symbols are exported).

See the CHANGES file for reports on completed work, and the General sub-project for planned and in-progress work.

Extras

  • Utility filters
  • Build target 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.

Source code

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:

  • Be provided under the Apache 2.0. You‘ll be prompted with a one-time “click-through” Contributor’s License Agreement (CLA) dialog as part of submitting your pull request or other contribution to GitHub.
  • Include tests to cover updated functionality.
  • C++ code should follow the Google C++ Style Guide.
  • Code should be formatted with clang-format. Settings are defined by the included .clang-format file.

We intend to maintain a linear history on the GitHub master branch.

Source code organization

  • example: demo code of using SPIRV-Tools APIs
  • external/googletest: Intended location for the googletest sources, not provided
  • include/: API clients should add this directory to the include search path
  • external/spirv-headers: Intended location for SPIR-V headers, not provided
  • include/spirv-tools/libspirv.h: C API public interface
  • source/: API implementation
  • test/: Tests, using the googletest framework
  • tools/: Command line executables

Tests

The 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:

  • If SPIR-V Tools is configured as part of an enclosing project, then the enclosing project should configure googletest before configuring SPIR-V Tools.
  • If SPIR-V Tools is configured as a standalone project, then download the 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.

Build

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.

CMake options

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.

Library

Usage

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.

Entry points

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. Incomplete
  • spvValidateBinary implements the validator functionality. Incomplete

The 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

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.

Assembler tool

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.

Disassembler tool

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.

Linker tool

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

Optimizer tool

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

Validator tool

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

Control flow dumper tool

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

Utility filters

  • 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
    
    • The 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

Tests are only built when googletest is found. Use ctest to run all the tests.

Future Work

See the projects pages for more information.

Assembler and disassembler

  • The disassembler could emit helpful annotations in comments. For example:
    • Use variable name information from debug instructions to annotate key operations on variables.
    • Show control flow information by annotating OpLabel instructions with that basic block's predecessors.
  • Error messages could be improved.

Validator

This is a work in progress.

Linker

  • The linker could accept math transformations such as allowing MADs, or other math flags passed at linking-time in OpenCL.
  • Linkage attributes can not be applied through a group.
  • Check decorations of linked functions attributes.
  • Remove dead instructions, such as OpName targeting imported symbols.

Licence

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.