Encourage use of the validator
[platform/upstream/SPIRV-Tools.git] / README.md
1 # SPIR-V Tools
2
3 [![Build Status](https://travis-ci.org/KhronosGroup/SPIRV-Tools.svg?branch=master)](https://travis-ci.org/KhronosGroup/SPIRV-Tools)
4 [![Build status](https://ci.appveyor.com/api/projects/status/gpue87cesrx3pi0d/branch/master?svg=true)](https://ci.appveyor.com/project/Khronoswebmaster/spirv-tools/branch/master)
5
6 ## Overview
7
8 The SPIR-V Tools project provides an API and commands for processing SPIR-V
9 modules.
10
11 The project includes an assembler, binary module parser, disassembler,
12 validator, and optimizer for SPIR-V. Except for the optimizer, all are based
13 on a common static library.  The library contains all of the implementation
14 details, and is used in the standalone tools whilst also enabling integration
15 into other code bases directly. The optimizer implementation resides in its
16 own library, which depends on the core library.
17
18 The interfaces have stabilized:
19 We don't anticipate making a breaking change for existing features.
20
21 See [`projects.md`](projects.md) to see how we use the
22 [GitHub Project
23 feature](https://help.github.com/articles/tracking-the-progress-of-your-work-with-projects/)
24 to organize planned and in-progress work.
25
26 SPIR-V is defined by the Khronos Group Inc.
27 See the [SPIR-V Registry][spirv-registry] for the SPIR-V specification,
28 headers, and XML registry.
29
30 ## Verisoning SPIRV-Tools
31
32 See [`CHANGES`](CHANGES) for a high level summary of recent changes, by version.
33
34 SPIRV-Tools project version numbers are of the form `v`*year*`.`*index* and with
35 an optional `-dev` suffix to indicate work in progress.  For exampe, the
36 following versions are ordered from oldest to newest:
37
38 * `v2016.0`
39 * `v2016.1-dev`
40 * `v2016.1`
41 * `v2016.2-dev`
42 * `v2016.2`
43
44 Use the `--version` option on each command line tool to see the software
45 version.  An API call reports the software version as a C-style string.
46
47 ## Supported features
48
49 ### Assembler, binary parser, and disassembler
50
51 * Based on SPIR-V version 1.1 Rev 3
52 * Support for extended instruction sets:
53   * GLSL std450 version 1.0 Rev 3
54   * OpenCL version 1.0 Rev 2
55 * Support for SPIR-V 1.0 (with or without additional restrictions from Vulkan 1.0)
56 * Assembler only does basic syntax checking.  No cross validation of
57   IDs or types is performed, except to check literal arguments to
58   `OpConstant`, `OpSpecConstant`, and `OpSwitch`.
59
60 See [`syntax.md`](syntax.md) for the assembly language syntax.
61
62 ### Validator
63
64 The validator checks validation rules described by the SPIR-V specification.
65
66 Khronos recommends that tools that create or transform SPIR-V modules use the
67 validator to ensure their outputs are valid, and that tools that consume SPIR-V
68 modules optionally use the validator to protect themselves from bad inputs.
69 This is especially encouraged for debug and development scenarios.
70
71 The validator has one-sided error: it will only return an error when it has
72 implemented a rule check and the module violates that rule.
73
74 The validator is incomplete.
75 See the [CHANGES](CHANGES) file for reports on completed work, and
76 the [Validator
77 sub-project](https://github.com/KhronosGroup/SPIRV-Tools/projects/1) for planned
78 and in-progress work.
79
80 *Note*: The validator checks some Universal Limits, from section 2.17 of the SPIR-V spec.
81 The validator will fail on a module that exceeds those minimum upper bound limits.
82 It is [future work](https://github.com/KhronosGroup/SPIRV-Tools/projects/1#card-1052403)
83 to parameterize the validator to allow larger
84 limits accepted by a more than minimally capable SPIR-V consumer.
85
86
87 ### Optimizer
88
89 *Warning:* The optimizer is still under development.
90
91 Currently supported optimizations:
92 * Strip debug info
93 * Set spec constant default value
94 * Freeze spec constant
95 * Fold `OpSpecConstantOp` and `OpSpecConstantComposite`
96 * Unify constants
97 * Eliminate dead constant
98
99 For the latest list with detailed documentation, please refer to
100 [`include/spirv-tools/optimizer.hpp`](include/spirv-tools/optimizer.hpp).
101
102 ### Extras
103
104 * [Utility filters](#utility-filters)
105 * Build target `spirv-tools-vimsyntax` generates file `spvasm.vim`.
106   Copy that file into your `$HOME/.vim/syntax` directory to get SPIR-V assembly syntax
107   highlighting in Vim.  This build target is not built by default.
108
109 ## Source code
110
111 The SPIR-V Tools are maintained by members of the The Khronos Group Inc.,
112 at https://github.com/KhronosGroup/SPIRV-Tools.
113
114 Contributions via merge request are welcome. Changes should:
115 * Be provided under the [Apache 2.0](#license).
116   You'll be prompted with a one-time "click-through" Contributor's License
117   Agreement (CLA) dialog as part of submitting your pull request or
118   other contribution to GitHub.
119 * Include tests to cover updated functionality.
120 * C++ code should follow the [Google C++ Style Guide][cpp-style-guide].
121 * Code should be formatted with `clang-format`.  Settings are defined by
122   the included [.clang-format](.clang-format) file.
123
124 We intend to maintain a linear history on the GitHub `master` branch.
125
126 ### Source code organization
127
128 * `example`: demo code of using SPIRV-Tools APIs
129 * `external/googletest`: Intended location for the
130   [googletest][googletest] sources, not provided
131 * `include/`: API clients should add this directory to the include search path
132 * `external/spirv-headers`: Intended location for
133   [SPIR-V headers][spirv-headers], not provided
134 * `include/spirv-tools/libspirv.h`: C API public interface
135 * `source/`: API implementation
136 * `test/`: Tests, using the [googletest][googletest] framework
137 * `tools/`: Command line executables
138
139 ### Tests
140
141 The project contains a number of tests, used to drive development
142 and ensure correctness.  The tests are written using the
143 [googletest][googletest] framework.  The `googletest`
144 source is not provided with this project.  There are two ways to enable
145 tests:
146 * If SPIR-V Tools is configured as part of an enclosing project, then the
147   enclosing project should configure `googletest` before configuring SPIR-V Tools.
148 * If SPIR-V Tools is configured as a standalone project, then download the
149   `googletest` source into the `<spirv-dir>/external/googletest` directory before
150   configuring and building the project.
151
152 *Note*: You must use a version of googletest that includes
153 [a fix][googletest-pull-612] for [googletest issue 610][googletest-issue-610].
154 The fix is included on the googletest master branch any time after 2015-11-10.
155 In particular, googletest must be newer than version 1.7.0.
156
157 ## Build
158
159 The project uses [CMake][cmake] to generate platform-specific build
160 configurations. Assume that `<spirv-dir>` is the root directory of the checked
161 out code:
162
163 ```sh
164 cd <spirv-dir>
165 git clone https://github.com/KhronosGroup/SPIRV-Headers.git external/spirv-headers
166 git clone https://github.com/google/googletest.git external/googletest # optional
167
168 mkdir build && cd build
169 cmake [-G <platform-generator>] <spirv-dir>
170 ```
171
172 Once the build files have been generated, build using your preferred
173 development environment.
174
175 ### CMake options
176
177 The following CMake options are supported:
178
179 * `SPIRV_COLOR_TERMINAL={ON|OFF}`, default `ON` - Enables color console output.
180 * `SPIRV_SKIP_TESTS={ON|OFF}`, default `OFF`- Build only the library and
181   the command line tools.  This will prevent the tests from being built.
182 * `SPIRV_SKIP_EXECUTABLES={ON|OFF}`, default `OFF`- Build only the library, not
183   the command line tools and tests.
184 * `SPIRV_USE_SANITIZER=<sanitizer>`, default is no sanitizing - On UNIX
185   platforms with an appropriate version of `clang` this option enables the use
186   of the sanitizers documented [here][clang-sanitizers].
187   This should only be used with a debug build.
188 * `SPIRV_WARN_EVERYTHING={ON|OFF}`, default `OFF` - On UNIX platforms enable
189   more strict warnings.  The code might not compile with this option enabled.
190   For Clang, enables `-Weverything`.  For GCC, enables `-Wpedantic`.
191   See [`CMakeLists.txt`](CMakeLists.txt) for details.
192 * `SPIRV_WERROR={ON|OFF}`, default `ON` - Forces a compilation error on any
193   warnings encountered by enabling the compiler-specific compiler front-end
194   option.
195
196 ## Library
197
198 ### Usage
199
200 The internals of the library use C++11 features, and are exposed via both a C
201 and C++ API.
202
203 In order to use the library from an application, the include path should point
204 to `<spirv-dir>/include`, which will enable the application to include the
205 header `<spirv-dir>/include/spirv-tools/libspirv.h{|pp}` then linking against
206 the static library in `<spirv-build-dir>/source/libSPIRV-Tools.a` or
207 `<spirv-build-dir>/source/SPIRV-Tools.lib`.
208 For optimization, the header file is
209 `<spirv-dir>/include/spirv-tools/optimizer.hpp`, and the static library is
210 `<spirv-build-dir>/source/libSPIRV-Tools-opt.a` or
211 `<spirv-build-dir>/source/SPIRV-Tools-opt.lib`.
212
213 * `SPIRV-Tools` CMake target: Creates the static library:
214   * `<spirv-build-dir>/source/libSPIRV-Tools.a` on Linux and OS X.
215   * `<spirv-build-dir>/source/libSPIRV-Tools.lib` on Windows.
216 * `SPIRV-Tools-opt` CMake target: Creates the static library:
217   * `<spirv-build-dir>/source/libSPIRV-Tools-opt.a` on Linux and OS X.
218   * `<spirv-build-dir>/source/libSPIRV-Tools-opt.lib` on Windows.
219
220 #### Entry points
221
222 The interfaces are still under development, and are expected to change.
223
224 There are five main entry points into the library in the C interface:
225
226 * `spvTextToBinary`: An assembler, translating text to a binary SPIR-V module.
227 * `spvBinaryToText`: A disassembler, translating a binary SPIR-V module to
228   text.
229 * `spvBinaryParse`: The entry point to a binary parser API.  It issues callbacks
230   for the header and each parsed instruction.  The disassembler is implemented
231   as a client of `spvBinaryParse`.
232 * `spvValidate` implements the validator functionality. *Incomplete*
233 * `spvValidateBinary` implements the validator functionality. *Incomplete*
234
235 The C++ interface is comprised of two classes, `SpirvTools` and `Optimizer`,
236 both in the `spvtools` namespace.
237 * `SpirvTools` provides `Assemble`, `Disassemble`, and `Validate` methods.
238 * `Optimizer` provides methods for registering and running optimization passes.
239
240 ## Command line tools
241
242 Command line tools, which wrap the above library functions, are provided to
243 assemble or disassemble shader files.  It's a convention to name SPIR-V
244 assembly and binary files with suffix `.spvasm` and `.spv`, respectively.
245
246 ### Assembler tool
247
248 The assembler reads the assembly language text, and emits the binary form.
249
250 The standalone assembler is the exectuable called `spirv-as`, and is located in
251 `<spirv-build-dir>/tools/spirv-as`.  The functionality of the assembler is implemented
252 by the `spvTextToBinary` library function.
253
254 * `spirv-as` - the standalone assembler
255   * `<spirv-dir>/tools/as`
256
257 Use option `-h` to print help.
258
259 ### Disassembler tool
260
261 The disassembler reads the binary form, and emits assembly language text.
262
263 The standalone disassembler is the executable called `spirv-dis`, and is located in
264 `<spirv-build-dir>/tools/spirv-dis`. The functionality of the disassembler is implemented
265 by the `spvBinaryToText` library function.
266
267 * `spirv-dis` - the standalone disassembler
268   * `<spirv-dir>/tools/dis`
269
270 Use option `-h` to print help.
271
272 The output includes syntax colouring when printing to the standard output stream,
273 on Linux, Windows, and OS X.
274
275 ### Optimizer tool
276
277 The optimizer processes a SPIR-V binary module, applying transformations
278 in the specified order.
279
280 This is a work in progress, with initially only few available transformations.
281
282 * `spirv-opt` - the standalone optimizer
283   * `<spirv-dir>/tools/opt`
284
285 ### Validator tool
286
287 *Warning:* This functionality is under development, and is incomplete.
288
289 The standalone validator is the executable called `spirv-val`, and is located in
290 `<spirv-build-dir>/tools/spirv-val`. The functionality of the validator is implemented
291 by the `spvValidate` library function.
292
293 The validator operates on the binary form.
294
295 * `spirv-val` - the standalone validator
296   * `<spirv-dir>/tools/val`
297
298 ### Control flow dumper tool
299
300 The control flow dumper prints the control flow graph for a SPIR-V module as a
301 [GraphViz](http://www.graphviz.org/) graph.
302
303 This is experimental.
304
305 * `spirv-cfg` - the control flow graph dumper
306   * `<spirv-dir>/tools/cfg`
307
308 ### Utility filters
309
310 * `spirv-lesspipe.sh` - Automatically disassembles `.spv` binary files for the
311   `less` program, on compatible systems.  For example, set the `LESSOPEN`
312   environment variable as follows, assuming both `spirv-lesspipe.sh` and
313   `spirv-dis` are on your executable search path:
314   ```
315    export LESSOPEN='| spirv-lesspipe.sh "%s"'
316   ```
317   Then you page through a disassembled module as follows:
318   ```
319   less foo.spv
320   ```
321   * The `spirv-lesspipe.sh` script will pass through any extra arguments to
322     `spirv-dis`.  So, for example, you can turn off colours and friendly ID
323     naming as follows:
324     ```
325     export LESSOPEN='| spirv-lesspipe.sh "%s" --no-color --raw-id'
326     ```
327
328 * `50spirv-tools.el` - Automatically disassembles '.spv' binary files when
329   loaded into the emacs text editor, and re-assembles them when saved,
330   provided any modifications to the file are valid.  This functionality
331   must be explicitly requested by defining the symbol
332   SPIRV_TOOLS_INSTALL_EMACS_HELPERS as follows:
333   ```
334   cmake -DSPIRV_TOOLS_INSTALL_EMACS_HELPERS=true ...
335   ```
336
337   In addition, this helper is only installed if the directory /etc/emacs/site-start.d
338   exists, which is typically true if emacs is installed on the system.
339
340   Note that symbol IDs are not currently preserved through a load/edit/save operation.
341   This may change if the ability is added to spirv-as.
342
343
344 ### Tests
345
346 Tests are only built when googletest is found. Use `ctest` to run all the
347 tests.
348
349 ## Future Work
350 <a name="future"></a>
351
352 _See the [projects pages](https://github.com/KhronosGroup/SPIRV-Tools/projects)
353 for more information._
354
355 ### Assembler and disassembler
356
357 * The disassembler could emit helpful annotations in comments.  For example:
358   * Use variable name information from debug instructions to annotate
359     key operations on variables.
360   * Show control flow information by annotating `OpLabel` instructions with
361     that basic block's predecessors.
362 * Error messages could be improved.
363
364 ### Validator
365
366 This is a work in progress.
367
368 ## Licence
369 <a name="license"></a>
370 Full license terms are in [LICENSE](LICENSE)
371 ```
372 Copyright (c) 2015-2016 The Khronos Group Inc.
373
374 Licensed under the Apache License, Version 2.0 (the "License");
375 you may not use this file except in compliance with the License.
376 You may obtain a copy of the License at
377
378     http://www.apache.org/licenses/LICENSE-2.0
379
380 Unless required by applicable law or agreed to in writing, software
381 distributed under the License is distributed on an "AS IS" BASIS,
382 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
383 See the License for the specific language governing permissions and
384 limitations under the License.
385 ```
386
387 [spirv-registry]: https://www.khronos.org/registry/spir-v/
388 [spirv-headers]: https://github.com/KhronosGroup/SPIRV-Headers
389 [googletest]: https://github.com/google/googletest
390 [googletest-pull-612]: https://github.com/google/googletest/pull/612
391 [googletest-issue-610]: https://github.com/google/googletest/issues/610
392 [CMake]: https://cmake.org/
393 [cpp-style-guide]: https://google.github.io/styleguide/cppguide.html
394 [clang-sanitizers]: http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation