# Amber

Amber is a multi-API shader test framework.

Amber lets you capture and communicate shader bugs with the fluidity and ease of
a scripting flow:

* No graphics API programming is required.
  * Supports Vulkan graphics API
  * WIP: Supports [Dawn][Dawn] graphics API
* A single text string (or file) maps to a single graphics API pipeline test
  case. The text includes:
  * Input data, including buffers and images.
  * Shaders.
  * Expectations for the result of running the pipeline.
* Shaders can be expressed in binary form (as hex), in SPIR-V assembly, or in a
  higher level shader language.
* After executing the pipeline, result buffers and images can be saved to output
  files.

Amber is influenced by [Talvos][Talvos] and [VkRunner][VkRunner].
The [VkScript](docs/vk_script.md) syntax matches the format used by VkRunner.

This is not an officially supported Google product.

## Writing Amber Tests
Working with Amber involves writing input test files. Some example files can be
see in the [tests/cases](tests/cases) folder.

The main input format is [Amberscript](docs/amber_script.md). New features are
added to AmberScript as Amber is enhanced. This is the preferred format in which
new script files are written.

### Clear test as AmberScript

```groovy
SHADER vertex vtex_shader PASSTHROUGH
SHADER fragment frag_shader GLSL
#version 430

layout(location = 0) in vec4 color_in;
layout(location = 0) out vec4 color_out;

void main() {
  color_out = color_in;
}
END

BUFFER img_buf FORMAT B8G8R8A8_UNORM

PIPELINE graphics my_pipeline
  ATTACH vtex_shader
  ATTACH frag_shader

  FRAMEBUFFER_SIZE 256 256
  BIND BUFFER img_buf AS color LOCATION 0
END

CLEAR my_pipeline
EXPECT img_buf IDX 0 0 SIZE 256 256 EQ_RGBA 0 0 0 0
```

The [VkScript](docs/vk_script.md) format is supported for historic reasons. It
is based off, and very closely matches, the format accepted by VkRunner. There
are no new features being added to VkScript, it is for historical use.

### Clear test as VkScript

```
[require]
VK_KHR_get_physical_device_properties2

[vertex shader passthrough]

[fragment shader]
#version 430

layout(location = 0) in vec4 color_in;
layout(location = 0) out vec4 color_out;

void main() {
  color_out = color_in;
}

[test]
clear
relative probe rect rgba (0.0, 0.0, 1.0, 1.0) (0, 0, 0, 0)
```

## Requirements

 * Recommended: Configure at least one backend. See [Backends](#backends) below.
 * Git
 * CMake (version 3.7+ enables automatic discovery of an installed Vulkan SDK)
 * Ninja (or other build tool)
 * Python, for fetching dependencies and building Vulkan wrappers


## Building
```
git clone https://github.com/google/amber.git
cd amber
./tools/git-sync-deps
mkdir -p out/Debug
cd out/Debug
cmake -GNinja ../..
ninja
```

Alternatives:

* On Windows, Amber normally statically links against the C runtime library.
  To override this and link against a shared C runtime, CMake option
  `-DAMBER_ENABLE_SHARED_CRT`.
  This will cause Amber to be built with `/MD` for release builds or `/MDd` for
  debug builds.

### Android

* Android build needs Android SDK 28, Android NDK r25b, Java 8. If you prefer
  other versions of Android SDK, Android NDK, Java, then you can change
  `ANDROID_PLATFORM` and `ANDROID_BUILD_TOOL_VERSION` in
  `tools/build-amber-sample.sh`.
* Set up Android SDK path by running
  `export ANDROID_SDK_HOME=path/to/Android/SDK` in your shell.
* Set up Android NDK path by running
  `export ANDROID_NDK_HOME=path/to/Android/NDK` in your shell.
* Generate a KeyStore using `keytool` command and set up `KEY_STORE_PATH`
  env variable for the KeyStore file path.
* Run `./tools/build-amber-sample.sh [build output directory path]`.

#### Android plain executable

It is possible to obtain a plain executable for Android, as opposed to an APK,
with the following:

```
git clone https://github.com/google/amber.git
cd amber
./tools/git-sync-deps

./tools/update_build_version.py . samples/ third_party/
./tools/update_vk_wrappers.py . .

mkdir build
cd build
mkdir app
mkdir libs
${ANDROID_NDK_HOME}/ndk-build -C ../samples NDK_PROJECT_PATH=. NDK_LIBS_OUT=`pwd`/libs NDK_APP_OUT=`pwd`/app
```

The list of target ABIs can be configured in `samples/jni/Application.mk` by
editing the APP_ABI entry:

```
APP_ABI := arm64-v8a armeabi-v7a x86 x86_64
```

The resulting executable will be produced as
`build/app/local/<abi>/amber_ndk`. This executable can be run via the adb shell
on your device, e.g. under `/data/local/tmp` (`/sdcard` is generally not
suitable because it is mounted with a non-executable flag). Also, vulkan layers
may not be available to this executable as it is not an app, so make sure to use
the `-d` flag to disable Vulkan layers:

```
adb push build/app/local/<abi>/amber_ndk /data/local/tmp
adb shell
# Now on device shell
cd /data/local/tmp
./amber_ndk -d <shader-test-files>
```

### Optional Components

The components which build up Amber can be enabled or disabled as needed. Any
option with `_SKIP_` in the name is on by default, any with `_USE_` is off by
default.

The available flags which can be defined are:
 * AMBER_SKIP_TESTS -- Skip building Amber unit tests
 * AMBER_SKIP_SAMPLES -- Skip building the Amber sample applications
 * AMBER_SKIP_SPIRV_TOOLS -- Disable the SPIRV-Tools integration
 * AMBER_SKIP_SHADERC -- Disable the ShaderC integration
 * AMBER_SKIP_LODEPNG -- Disable the LodePNG integration
 * AMBER_USE_DXC -- Enables DXC as a shader compiler
 * AMBER_USE_LOCAL_VULKAN -- Does not try to find the Vulkan SDK, builds needed
                             components locally
 * AMBER_USE_CLSPV -- Enables CLSPV as a shader compiler
 * AMBER_USE_SWIFTSHADER -- Builds Swiftshader so it can be used as a Vulkan ICD

```
cmake -DAMBER_SKIP_TESTS=True -DAMBER_SKIP_SPIRV_TOOLS=True -GNinja ../..
```

#### DXC

DXC can be enabled in Amber by adding the `-DAMBER_USE_DXC=true` flag when
running cmake.

## Build Bots

There are a number of build bots to verify Amber continues to compile and run
on the various targets. Due to bot limitations, the integration tests are not
being run on the bots, just the unit tests.

## Backends

Amber is designed to run against different graphics APIs.
Amber will build if no graphics API is found, but will only allow verifying the
syntax of the amber script files.

Currently the Vulkan and Dawn graphics APIs are supported.

### Using Vulkan as a backend

A Vulkan implementation is found by CMake in the following priority order:

 * If `AMBER_USE_LOCAL_VULKAN` is enable the headers, loader and layers will be
   built locally and not found on the system.
 * If an enclosing CMake project includes the
   [Vulkan-Headers][Vulkan-Headers]
   CMake project, then headers will be picked up from there.

   In this case the CMake variable `Vulkan_LIBRARIES` can name the
   Vulkan library, or a default of `vulkan` will be used.

 * If you have CMake 3.7 or later, then the Vulkan implementation will
   be found from a Vulkan SDK as published by LunarG.

   Environment variables:
   * `VULKAN_SDK` should point to the platform-specific SDK directory
     that contains the `include` and `lib` directories.
   * `VK_ICD_FILENAMES` should point to the ICD JSON file.
   * `VK_LAYER_PATH` should point to the explicit\_layer.d folder.
   * `LD_LIBRARY_PATH` must contain the $VULKAN_SDK/lib/ folder for the
     validation libraries.

   ```
   export VULKAN_SDK=$HOME/vulkan-macos-1.1.85.0/macOS
   export VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d/MoltenVK_icd.json
   export VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d
   export LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH
   ```

### Using Dawn as a backend

We assume you have built [Dawn][Dawn] from source, and have access to both the
source and build trees. To build a Dawn backend for Amber, set the following
CMake variables when configuring Amber:

  * `Dawn_INCLUDE_DIR`: The directory containing `dawn/dawn_export.h`
    (in the source tree).
  * `Dawn_GEN_INCLUDE_DIR`: The directory containing generated header
    `dawn/dawncpp.h` (in the build output tree).
  * `Dawn_LIBRARY_DIR`: The directory containing the `dawn_native` library (in
    the build output tree).

### Using SwiftShader as a backend

SwiftShader, if available, can be used by by exporting the `VK_ICD_FILENAMES`
environment variable and using it directly. If SwiftShader is not installed it
can be built with Amber by setting `AMBER_ENABLE_SWIFTSHADER` during the
configure step of CMake.


```
mkdir out/sw
cd out/sw
cmake -GNinja -DAMBER_ENABLE_SWIFTSHADER=TRUE ../..
ninja
export VK_ICD_FILENAMES=$PWD/Linux/vk_swiftshader_icd.json
./amber -d -V    # Should see SwiftShader listed as device
./amber -d ../../tests/cases/clear.amber
```

## Amber Samples

The build will generate an `out/Debug/amber` executable which can be used to
run amber scripts. The script can be used as
`out/Debug/amber <path to amber file>`.

```
out/Debug/amber tests/cases/clear.amber
```

The sample app returns a value of 0 on success or non-zero on error. Any issues
encountered should be displayed on the console.

Run `out/Debug/amber -h` to see a description of the program's command line options.

Example AmberScript files can be found in the [tests/cases](tests/cases)
directory in this repository.
Also the [Vulkan Conformance Test
Suite](https://github.com/KhronosGroup/VK-GL-CTS) contains many real-world
examples in its
[external/vulkancts/data/vulkan/amber](https://github.com/KhronosGroup/VK-GL-CTS/tree/master/external/vulkancts/data/vulkan/amber)
subdirectory.

By default, `out/Debug/amber` supports saving the output image into '.png'
file. You can disable this by passing `-DAMBER_SKIP_LODEPNG=true` to cmake.

The `image_diff` program will also be created. This allows comparing two images
using the Amber buffer comparison methods.

## Contributing

Please see the [CONTRIBUTING](CONTRIBUTING.md) and
[CODE_OF_CONDUCT](CODE_OF_CONDUCT.md) files on how to contribute to Amber.


## References
[Dawn]: https://dawn.googlesource.com/dawn/
[Talvos]: https://talvos.github.io/
[Vulkan-Headers]: https://github.com/KhronosGroup/Vulkan-Headers
[VkRunner]: https://github.com/igalia/vkrunner

