# Shader Variations

To build multiple variations of a shader, add a file named X.json corresponding to shader file X.  A
variation is generated by building the shader with different definitions (a la glslang_validator's
-DName=1).  These definitions come from flags and enumerations defined in the json file.  Without a
.json file, the shader is generated as is (1 variation).

There are multiple possible fields in the json file:

- "Description": This contains the license and other comments, which will be ignored.
- "Flags": this is a list of flags.  Each flag FLAG defines a shader variation with or without the
  define FLAG=1.
- other: any other field is a similar list to flags, except that each entry in this enumeration is a
  variation.  Similar to "flags", every entry ENTRY results in an ENTRY=1 define.

Flags are shorthand for 2-entry enumerations.  Given n flags, there are 2^n variations where every
flag is either present or not.  For enumerations, only one entry is active in any variation.  Thus,
an enumeration with n entries generates n variations.

## Example

Here is an example json file:

{
    "Description": [
        "Copyright 2018 The ANGLE Project Authors. All rights reserved.",
        "Use of this source code is governed by a BSD-style license that can be",
        "found in the LICENSE file.",
        "",
        "RayTrace.comp.json: Build parameters for RayTrace.comp."
    ],
    "Flags": [
        "NanFilter",
        "WorkaroundIntelBug"
    ],
    "RayTraceQuality": [
        "IsRTLowRes",
        "IsRTHighRes",
        "IsRTAwesome"
    ],
    "ImageType": [
        "IsR",
        "IsRG",
        "IsRGB",
        "IsRGBA"
    ]
}

This will generate 2^2 * 3 * 4 shaders.