From 7b19e21fdeee0721f7338f88853e25788175d95a Mon Sep 17 00:00:00 2001 From: Akio Gaule <10719597+akioCL@users.noreply.github.com> Date: Thu, 27 Jun 2024 13:25:47 -0400 Subject: [PATCH] Add specialization constants RFC Signed-off-by: Akio Gaule <10719597+akioCL@users.noreply.github.com> --- .../SpecializationConstants.md | 241 ++++++++++++++++++ .../sequence_diagram.jpg | Bin 0 -> 59500 bytes 2 files changed, 241 insertions(+) create mode 100644 rfcs/SpecializationConstants/SpecializationConstants.md create mode 100644 rfcs/SpecializationConstants/sequence_diagram.jpg diff --git a/rfcs/SpecializationConstants/SpecializationConstants.md b/rfcs/SpecializationConstants/SpecializationConstants.md new file mode 100644 index 0000000..56598db --- /dev/null +++ b/rfcs/SpecializationConstants/SpecializationConstants.md @@ -0,0 +1,241 @@ +### Summary: +Graphics APIs expose a number of methods for setting values within shader code during runtime. Uniform buffer objects (UBOs) are one of the most common approaches when it is necessary to set values within a shader at runtime and are used in many applications. UBOs are pushed to the shader just prior to its execution, this is after shader compilation which occurs during Pipeline creation. As these values are set after the shader has been compiled, the driver’s shader compiler has limited scope to perform optimizations to the shader during its compilation. This is because optimizations such as loop unrolling or unused code removal require the compiler to have knowledge of the values controlling them which is not possible with UBOs. Push constants, another method for setting shader values, also suffer from the same problems as UBOs, as they are also provided after the shader has been compiled. + +Unlike UBOs, specialization constants are set before pipeline creation meaning these values are known during shader compilation. This allows the driver’s shader compiler to perform optimizations. In this optimization process the compiler has the ability to remove unused code blocks and statically unroll which reduces the fragment cycles required by the shader which results in an increased performance. + +### What is the relevance of this feature? +To answer this question we first need to understand about Shader Variant Options on O3DE. Shader variant options are shader constants that are only used in conditional statements that can be statically optimized. You can choose to compile them as static constants (asset build time) or as global variables (runtime). + +Consider the following AZSL code snippet, where a shader variant option is used in a conditional branch: + +``` + if (o_useRed) { + color = float3(1, 0, 0); + } else { + color = float3(0, 0, 1); + } +``` + +In the shader code above, the value of o_useRed is not known at compilation time, so o_useRed is compiled as a shader constant. The shader bytecode branches at runtime depending on the runtime value of o_useRed. In general, branching is slow and should be avoided. + +In this scenario, if the value of o_useRed is defined as true at compilation time, then the compiler produces the following branch-less code. + + color = float3(1, 0, 0); +If o_useRed is defined as false at compilation time, then the compiler produces the following branch-less code: + + color = float3(0, 0, 1); +The example above produces three different versions of the compiled shader code (one with o_useRed = true, another with o_useRed = false, and another with o_useRed = undefined). These are called shader variants (ShaderVariantAsset). In order to get the best performance, 3 different shader compilations had to be done, and 3 new assets had to be created. As more shader variant options are added, the number of different combinations between them grows exponentially. It’s almost impossible to build all possible combinations of shader variant options for a typical project. So how do you know which shader variants to build? O3DE uses a combination of scripts (to crawl the materials being used for example) and user input (with the help of the Shader Management Tool) to build a list with the shader variants to generate. Since this list is only a subset of all possible combinations, what happens if the specific combination was not built during asset processing? Luckily O3DE has a fallback system, where shader variant options values are set at runtime using a UBO, so the proper shader code is executed. Unfortunately, as previously stated, the driver is unable to optimize shader variant values during Pipeline creation, since their values are not known at compilation. + +Now that we know how shader variant options drive the shader generation, it’s not hard to see how specialization constants can help. When using them, we can get the benefits of compile time optimization without the cost of having to create multiple variants of a shader. At runtime, using the specialization constant values, the shader is specialized when a new Pipeline object is built. This way the driver can optimize the shader knowing the values of the specialization constants, since they will not change during the lifetime of the specialized shader. Generating a list of shader variants to use is not needed, since only one variant is created during asset generation. + +### Feature design description: +Adding the use of specialization constants for shader variant options will be almost transparent for developers. The new design only changes the way shader variant options are implemented, not the way they are used. Developers will continue to create shaders with shader variant options in the same way as before, and all current shaders will continue to work without changes. + +Since not all graphics APIs support specialization constants, it is critical that the current support for shader variant options remain in the codebase. There will be 3 different ways of specifying when to use specialization constants: a global setting per API, a setting per shader and a setting per shader variant option. + +Since specialization constants is a platform dependent feature, the first step is to analyze how they are implemented in the supported graphic APIs on O3DE: + +**Vulkan** + +Specialization constants in Vulkan are a mechanism allowing a constant value in SPIR-V to be specified at VkPipeline creation time. Vulkan supports multiple types as specialized constants (int, float, bool, etc). The first step to use them is declaring specialized constants in the shader. Fortunately DXC provides a simple attribute for promoting a global constant to a specialized constant. + +``` +[[vk::constant_id(1)]] +const float o_myColor = 1.0; +``` + +The next step is providing the proper constant values in order to specialize the shader. This is done during the pipeline generation, since this is the moment that the driver compiles the SPIR-V into ISA code. To accomplish this a VkSpecializationInfo struct must be filled with the proper values for each of the shader stages in the pipeline. The following example describes the process: + +``` +struct myData { + float myColor = 1.0f; +} myData; + +VkSpecializationMapEntry mapEntry = {}; +mapEntry.constantID = 0; // matches vk::constant_id in HLSL +mapEntry.offset = 0; +mapEntry.size = sizeof(float); + +VkSpecializationInfo specializationInfo = {}; +specializationInfo.mapEntryCount = 1; +specializationInfo.pMapEntries = &mapEntry; +specializationInfo.dataSize = sizeof(myData); +specializationInfo.pData = &myData; + +VkGraphicsPipelineCreateInfo pipelineInfo = {}; +pipelineInfo.pStages[fragIndex].pSpecializationInfo = &specializationInfo; + +// Create first pipeline with myColor as 1.0 +vkCreateGraphicsPipelines(&pipelineInfo); + +// Create second pipeline with same shader, but sets different value +myData.myColor = 0.5f; +vkCreateGraphicsPipelines(&pipelineInfo); +``` + +**Metal** + +Specialization constants are called function specialization on Metal. Like Vulkan, it supports multiple data types as constants. To declare a function constant in a Metal shader you use the following syntax: + +`constant float o_myColor [[function_constant(1)]];` + +When creating the pipeline object, the proper constant values must be pass: + +``` +struct myData { + float myColor = 1.0f; +} myData; + +MTLFunctionConstantValues* values = [MTLFunctionConstantValues new]; +[values setConstantValue: &myData.myColor + Type: MTLDataTypeFloat + withName: “Color”]; + +MTLRenderPipelineDescriptor *dsc = [MTLRenderPipelineDescriptor new]; +NSError *error = nil; +dsc.fragmentFunction = [shader_library newFunctionWithName:@”main” + constantValues:values + error:&error]; +``` + +**DX12** + +DX12 doesn’t support specialization constants. It has been requested by the [community ](https://github.com/microsoft/hlsl-specs/issues/71), but at the moment there’s no plans to include them. Luckily, there’s an implementation from the developers of Godot engine (which is open source) that supports something similar to specialization constants on DX12. The approach is described in full in the this [article ](https://godotengine.org/article/d3d12-adventures-in-shaderland/). The basic idea is to use a constant with a “magic” value that can be detected, so at runtime it can be patched using the proper value. There’s a lot of more details, since you need to find, update and delete DXIL instructions in order to properly patch the shader. One of the downsides of this solution is that any modification to the DXIL shader bytecode requires a re-sign. To do that, a specific DLL (dxil.dll) from Microsoft must be included with the engine (and any application built with it). There are some projects that were able to reverse engineer the shader bytecode signing algorithm without the DLL (https://devlog.hexops.com/2024/building-the-directx-shader-compiler-better-than-microsoft/). As part of the investigation for this RFC, I was able to create a functional proof of concept of Godot’s technique on O3DE. The patching works as expected but only supports int, floats and booleans types. + +### Technical design description: + +Shader variant options can only be of type bool, int, or enum. They cannot be of type float or struct. Fortunately, all graphics APIs on O3DE support the necessary types as specialization constants. + +#### Generating shaders with specialization constants + +During the shader generation process, the first step is generating the HLSL code from the AZSL shader. To do this, O3DE uses the AZSLc compiler. One of the jobs of AZSLc is translating shader variant options (declared as an “option” in AZSL language) into the proper HLSL instructions. We need to tell AZSLc that we will be using specialization constants, because this modifies how the “options” are being translated. A global option for enabling the use for specialization constants for all shader options will be added. This option will be enabled via command line: + +`–sc-options` + +Since shaders can override the command line arguments that are passed to AZSLc, each shader could also decide to disable or enable the use of specialization constants (remove or add argument '-sc-options') + +The generation of specialization constants varies from graphics APIs. AZSLc already has a per platform code emitter, so we just need to add some new functionality to the existing PlatformEmitter interface: + +``` + struct PlatformEmitter + { +…. + [[nodiscard]] + virtual string GetSpecializationConstant(const CodeEmitter& codeEmitter, + const IdentifierUID& symbol, + const Options& options, + uint32_t id) const; +… +} +``` + +For certain use cases a shader variant option may perform better if it's baked during shader compilation (instead of using specialization constant). To handle this case a new attribute will be created which will force the use of the static method of #define (the current system) for a specific shader variant option. + +``` +[[no_specialize]] +option bool o_useNoiseTexture = true; +``` + +In the case of Vulkan, we just need to emit a single global constant with the [[vk::constant_id]] attribute. DXC will properly convert that into the SPIR-V specialization constant opcode. For Metal, the process is exactly the same, since O3DE first converts from HLSL to SPIR-V, and then from SPIR-V to MSL using SPIR-V Cross Compiler. Thankfully, SPIR-V Cross already supports specialization functions, so there’s nothing extra that we need to do for Metal. + +DX12 is a completely different case. Since DX12 doesn’t really support specialization constants we need to do some extra steps. First, AZSLc needs to transform shader variant options to “volatile” variables with an initialization value. Why volatile? This attribute prevents DXC from optimizing them during the compilation process. We need the variables to exist in the generated DXIL so we are able to patch them at runtime. Since volatile is a valid attribute only for local variables we need to encapsulate them in a function: + +``` +bool GetShaderVariantKey_o_enableFogLayer() +{ + volatile int sc_enableFogLayer = 1; + return (bool) sc_enableFogLayer; +} +``` + +The next step is to replace the generated “volatile” variables for real constants in the generated DXIL code. To accomplish this, a new tool called “DXSC” will be created in the forked DirectxShaderCompiler project. DXSC needs access to many LLVM and dxc functionality, so it makes sense to have it inside the DirectxShaderCompiler project. DXSC will replace the “volatile” variables with a special constant value. This value acts like a sentinel that we can later detect when doing the patching. This sentinel value has to be carefully selected so the probability to clash with a real value in a shader is low. When the sentinel value is detected, how does it know which specialization constant it belongs to? We use the initialization value of the “volatile” variable that we generated (e.g. 1 in the previous example) as the specialization constant index. Then, when generating the replacement value, we add this index to the sentinel to get the final value. This way, when detecting the sentinel, we can also extract the specialization constant index from the detected value. Since the runtime will not get access to LLVM code, we need a way to easily patch the specialization constants in the DXIL bytecode. To do this, DXSC will also output an offset for each specialization constant with the location of that constant in the shader bytecode. Using this information, the runtime can easily patch each specialization constant at the proper location. The offset information will be added to the ShaderStageFunction class. + +``` +class DX12::ShaderStageFunction + : public RHI::ShaderStageFunction +{ +… + using SpecializationConstantOffsets = AZStd::unordered_map; + AZStd::array m_scOffsets; +… +} +``` +#### Specializing shaders + +Once we have the shaders built with specialization constants we need to create the Pipeline objects with specialized shaders. To accomplish this we need to pass the values for the specialization constants when building the Pipeline. This information will be added to the PipelineStateDescriptor class: + +``` +using SpecializationValue = RHI::Handle; + +enum class SpecializationType : uint32_t +{ + Integer, + Bool, + Enumeration, + Invalid +}; + +struct SpecializationConstant +{ + SpecializationConstant() = default; + + SpecializationValue m_value; + Name m_name; + uint32_t m_order = 0; + SpecializationType m_type = SpecializationType::Invalid; + + bool operator==(const SpecializationConstant& rhs) const; + HashValue64 GetHash() const; +}; + +class PipelineStateDescriptor +{ +… + AZStd::vector m_specializationData; +… +} +``` + +With the specialization constant values, each RHI can create the pipeline with the proper specialized shaders. On Vulkan, you just need to fill up the VkSpecializationMapEntry struct for each constant, and then use a VkSpecializationInfo struct when calling the VkCreateGraphicsPipelines or VkCreateComputePipelines function. On Metal, it’s something similar. We need to populate a MTLFunctionConstantValues object with the constant values, and then use that when creating the fragment/vertex/compute function of the MTLRenderPipelineDescriptor object. DX12 is a more complex process. Using the offsets that were calculated by the new tool DXSC, we know the exact location of each specialization constant in the shader bytecode. With that information we can replace the sentinel value with the proper constant value that was passed in the PipelineStateDescriptor. Special care has to be taken when writing the constant value. LLVM uses a Variable Width Integer encoding when writing integers into the bytecode (https://llvm.org/docs/BitCodeFormat.html#variable-width-integer). In order to do a proper replacement, we must follow the same rules of encoding when writing the new value. After the patching, the new shader bytecode must be signed so it is accepted by the GPU drivers. To do this we need to use the DLL provided by Microsoft. After signing, the process continues as normal. + +#### Choosing the Shader Variant + +Shaders on O3DE are represented by a .shader file. Those shaders are processed and saved as ShaderAsset files. This asset doesn’t really contain the shader bytecode, that information is stored in a ShaderVariantAsset file. Each of them represents the compilation of the shaders stages with a specific combination of shader variant options. O3DE also uses another asset (ShaderVariantTree) that is in charge of managing all the different ShaderVariantAsset files that were generated. + +The runtime code has 2 classes, the Shader and ShaderVariant class, that manages the access to their asset equivalent. In order to compile a Pipeline, the runtime code has to access a ShaderVariant object that provides a method of getting the shader bytecode (in a ShaderVariantAsset object). O3DE uses two IDs to reference a ShaderVariant, the ShaderVariantId and the ShaderVariantStableId. The first one uses a bitset structure to save the values of the shader variant options that were used for generating a variant (very important to us since it will be used for populating the specialization constants). The second one is a generated unique id that was created by a tool when the ShaderVariantAsset file was built (e.g. Shader Management Tool). + +The current flow for accessing a ShaderVariant is the following: + +![flow](sequence_diagram.jpg) + +One important point to mention is that the requested ShaderVariant may not be exactly the one requested. The exact combination of shader variant options requested may not exist (it was never built) or it may be in the process of loading. O3DE returns the closest match, where some shader variant options may be baked at compile time, and others will need to be set at execution time using the fallback system. In the worst case, the root shader variant is returned (the one that doesn’t have any shader variant options set at compile time and it’s 100% dynamic) which is always available. + +Now that we know how shader variants are built and accessed, let's see how specialization constants would change this. When using specialization constants only a few ShaderVariants needs to be generated (only the root unless there's a shader option with the [[no_specialize]] attribute). The ShaderVariant can be specialized with the proper constant values at Pipeline creation time for all the different shader variant options combination. For this process we have 2 options: + +- Currently the ShaderVariant has the same ShaderVariantId and ShaderVariantStableId as the ShaderVariantAsset. This is because one ShaderVariant represents one specific ShaderVariantAsset. We could modify the ShaderVariant to have its own ShaderVariantId and ShaderVariantStableId and share the ShaderVariantAsset between multiple variants (which is where the shader bytecode lives). In this way the ShaderVariant will represent an “exact” match for the shader variant options being used. Technically the shader bytecode doesn’t have the constant values baked in during compilation, but they will be once the specialization constants are used for building the Pipeline. For the ShaderVariantStableId we can just generate a unique one per ShaderVariantId at runtime as needed. +This approach is very handy, because the ShaderVariant class already has a “ShaderVariant::ConfigurePipelineState” method that handles filling up a PipelineStateDescriptor. We just need to add the specialization constants configuration using the ShaderVariantId (which holds the values for the shader variant options). And moreover, this method is already used by all passes and RPI code to fill up the Pipeline descriptor, so no code will need to change for those that are using ShaderVariant::ConfigurePipelineState. + +- We keep the ShaderVariant as it is, and we always use the root ShaderVariant (since it’s the only one and we can specialize it). Then, we would need to create another function similar to ShaderVariant::ConfigurePipelineState, where using a ShaderVariantId or a ShaderOptionGroup as argument, we configure the specialization constants in the Pipeline descriptor. We cannot use the ShaderVariantId of the ShaderVariant to do this, because it doesn’t contain the values for the shader variant options. Then we would need to add a call to this newly created function in all the places where ShaderVariant::ConfigurePipelineState is being used. This approach requires more changes in the calling code, but keeps the ShaderVariant and ShaderVariantAsset relationship intact. + +### What are the advantages of the feature? +There’s 2 major advantages from using specialization constants for shader variant options. The first one is improving the asset generation by reducing the number of shader variants that need to be created. Since only a couple of shader variant are created per shader, we save compiling all other variants. In some projects that could be hundreds or even thousands of compilations. Not only we save time in processing the assets, but also the size of the project's assets is reduced. + +The second one is improving shader performance. With specialization constants the “perfect” shader variant is always used. This means that the driver can optimize further by removing branching and conditional code, constant folding, loop unrolling and other optimizations. All of this translates to faster code, and specially less code. Less code is important, because it affects the number of registers that are needed for executing a shader. Having a branch for example means that the GPU has to reserve more registers to handle both branches. Less register equals to more waves can be spawned, which translates to more code executed per cycle. + +### What are the disadvantages of the feature? +Offline optimizations can sometimes be more efficient than runtime optimizations. This is mainly due to the processing power and time that offline compilations have. Because of this, baking shader variant options at runtime may result in shaders that are more optimized than their specialization constant version. This is one of the reasons that the decision to use specialization constants will be done per shader and per shader option (the default option per shader will be whatever the API is using, but that could be overwritten). + +### How will this be implemented or integrated into the O3DE environment? +Integration will be transparent for developers, meaning that almost no code of them will need to be changed. +The only extra library that will be added is the Microsoft “DXIL.DLL” library which is used for signing DXIL bytecode at runtime. Currently this library is only used for generating the shader assets at build time. + +### Are there any alternatives to this feature? +The alternative is the current implementation of shader variant options. + +### How will users learn this feature? +Since it will not require developers intervention, a simple announcement of the feature will suffice. Documentation will need to be updated to show how users can disable specialization constants per shader. + +### Are there any open questions? +The only open question is how ShaderVariants are selected. The proposed solutions are already outlined in the document. + + diff --git a/rfcs/SpecializationConstants/sequence_diagram.jpg b/rfcs/SpecializationConstants/sequence_diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91a22a2f15d941e80e18270357794a39aea75907 GIT binary patch literal 59500 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 literal 0 HcmV?d00001