dawn-cmake/docs/tint/extensions/chromium_experimental_push_...

29 lines
1.2 KiB
Markdown
Raw Normal View History

tint: Add basic support for chromium_experimental_push_constant. This extension adds support for the push_constant storage class such that it can be tested with WGSL test files. The real goal is to allow future transforms that will add push constants that the SPIRV writer will output. The extension: - Adds the `chromium_experimental_push_constant` enable. - Allows the push_constant storage class for global variables. - Adds validation that the types are host-shareable for push_constant variables, and that they don't contain f16 (must be 32bit types only). - Validates that at most one push_constant variable is statically used per entry-point. - Skips validation that the extension has been enabled if kIgnoreStorageClass is used. Tests are added: - For parsing of var<push_constant> - Caught a missing conversion. - For each of the validation rules. - For the wrapping of push constants in structs if needed by AddSpirvBlockAttribute. - For the layout and type rules of the storage class. - For a shader with multiple entry-points using various push constants. - Caught a missing reset of the previous push constant variable in the validation check that at most one is used. - Caught the missing wrapping in structs that had to be added to AddSpirvBlockAttribute. - Caught incorrect logic when adding diagnostics about the call graph leading to the reference to push constants. Bug: tint:1620 Change-Id: I04a5d8e5188c0dcef077f2233ba1359d1575bf51 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/96682 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Ben Clayton <bclayton@google.com>
2022-08-02 15:55:35 +00:00
# Chromium Experimental Push Constant
The `chromium_experimental_push_constant` extension adds support for push constant global variables to WGSL.
Push constants are small amounts of data that are passed to the shader and are expected to be more lightweight to set / modify than uniform buffer bindings.
The concept of push constant comes from Vulkan but D3D12 has similar "root constants".
Metal doesn't have the same concept but push constants can be efficiently implemented with the `setBytes` family of command encoder methods.
## Status
Push constant support in Tint is highly experimental and only meant to be used in internal transforms at this stage.
Specification work in the WebGPU group hasn't started.
## Pseudo-specification
This extension adds a new `push_constant` address space that's only allowed on global variable declarations.
tint: Add basic support for chromium_experimental_push_constant. This extension adds support for the push_constant storage class such that it can be tested with WGSL test files. The real goal is to allow future transforms that will add push constants that the SPIRV writer will output. The extension: - Adds the `chromium_experimental_push_constant` enable. - Allows the push_constant storage class for global variables. - Adds validation that the types are host-shareable for push_constant variables, and that they don't contain f16 (must be 32bit types only). - Validates that at most one push_constant variable is statically used per entry-point. - Skips validation that the extension has been enabled if kIgnoreStorageClass is used. Tests are added: - For parsing of var<push_constant> - Caught a missing conversion. - For each of the validation rules. - For the wrapping of push constants in structs if needed by AddSpirvBlockAttribute. - For the layout and type rules of the storage class. - For a shader with multiple entry-points using various push constants. - Caught a missing reset of the previous push constant variable in the validation check that at most one is used. - Caught the missing wrapping in structs that had to be added to AddSpirvBlockAttribute. - Caught incorrect logic when adding diagnostics about the call graph leading to the reference to push constants. Bug: tint:1620 Change-Id: I04a5d8e5188c0dcef077f2233ba1359d1575bf51 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/96682 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Ben Clayton <bclayton@google.com>
2022-08-02 15:55:35 +00:00
Push constant variables must only contain 32bit data types (or aggregates of such types).
Push constant variable declarations must not have an initializer.
It is an error for a entry point to statically use more than one `push_constant` variable.
## Example usage
```
var<push_constant> draw_id : u32;
@fragment fn main() -> u32 {
return draw_id;
}
```