POD arguments in push constants (#542)

* Add options to pass POD args as push constants
  * validate option:
    * no -pod-ubo
    * no option that generates module scope push constants
* Add option to specify max push constant interface size

* Frontend checks for push constant pod args
  * disallow arrays in push constants

* Check the size against MaxPushConstantsSize()
* Validate the layout as std430
* New ArgKind for POD push constants
* Updated descriptor allocation to generate push constants resource vars
* update pod clustering to record the correct arg kind
* change descriptor map output for push constant kernel args
* update spirv producer to generate push constant interface variable

* docs

* Simplify pod arg kind logic
  * Change GetArgKindForType to be able to return specific pod types
  * update uses to not assume basic ArgKind::Pod is ambiguous
    * simplifies several bits of code

* Tests
17 files changed
tree: 9e761ade18284a72e44b5ff3697b32f414d4483e
  1. amber/
  2. cmake/
  3. docs/
  4. include/
  5. kokoro/
  6. lib/
  7. test/
  8. tools/
  9. utils/
  10. .clang-format
  11. .gitignore
  12. AUTHORS
  13. CMakeLists.txt
  14. CONTRIBUTING.md
  15. CONTRIBUTORS
  16. deps.json
  17. LICENSE
  18. README.md
README.md

clspv

Clspv is a prototype compiler for a subset of OpenCL C to Vulkan compute shaders.

It consists of:

  • A set of LLVM Module passes to transform a dialect of LLVM IR into a SPIR-V module containing Vulkan compute shaders.
  • A command line compiler tool called ‘clspv’ to compile a subset of OpenCL C into a Vulkan compute shader.

Clspv depends on external projects:

Legal

Clspv is licensed under the terms of the Apache 2.0 license. The AUTHORS file lists the copyright owners, while individual credit is given in the CONTRIBUTORS file. To contribute, see CONTRIBUTING.md.

Materials in projects Clspv depends on are licensed under their own terms.

Clspv is not an official Google product.

Status

The compiler is an incomplete prototype, with many rough edges.

The input language is a subset of OpenCL C version 1.2. The OpenCL C on Vulkan Specification describes the specific subset, and also the mapping into Vulkan compute shaders.

Examples

Compile a set of kernels into a SPIR-V binary module:

clspv foo.cl -o foo.spv

Emit the binary as a C initializer list, for easy embedding of a shader in in a C or C++ program source:

clspv -mfmt=c foo.cl -o -

Predefine some preprocessor symbols:

clspv -DWIDTH=32 -DHEIGHT=64 foo.cl -o foo.spv

Use OpenCL compiler options:

clspv -cl-fast-relaxed-math -cl-single-precision-constant foo.cl -o foo.spv

Show help:

clspv -help

Build

Tools

You will need:

  • CMake
  • Python
  • A C++ compiler
  • git

Getting sources for dependencies

Clspv depends on the sources for other projects, at specific commits. Run the following command to download those dependencies, and place them in the third_party directory:

python utils/fetch_sources.py

Building

Then, create a build directory:

cd <clspv-dir>
mkdir build
cd build

Then configure and build the code:

cmake <clspv-dir>
cmake --build .

This will build the clspv command line compiler and place it in location bin/clspv under the build directory.

Using Ninja to build, and other build options

We recommend you use the Ninja build tool if it's available. To do so, replace the last two commands with:

cmake -G Ninja <clspv-dir>
ninja

Other useful configuration options (the first cmake command):

  • -DCMAKE_BUILD_TYPE=RelWithDebInfo : Build in release mode, with debugging information. Default is a debug build.

See the CMake documentation for more generic options.

Test

To run the test suite from within the build directory:

cmake --build . --target check-spirv

Or if you are using Ninja:

ninja check-spirv