| # Framebuffer Fetch (experimental) |
| |
| This extension enables support for the |
| [`chromium_experimental_framebuffer_fetch`](../../tint/extensions/chromium_experimental_framebuffer_fetch.md) |
| WGSL extension. |
| |
| The extension is experimental and might change for example to gain new validation rules |
| (with extension struct) in the future. |
| |
| It is available on tiler Metal GPUs and Vulkan with the `InputAttachment` capability. |
| |
| ## Validation |
| |
| In `Device::CreateRenderPipeline` or `Device::CreateRenderPipelineAsync`: |
| - For each `@color(N) in : T` fragment in: |
| - color target N must exist |
| - color target N's format must match T in both component count and base type |
| |
| ## WGSL |
| |
| ### Validation |
| |
| * Requires `enable chromium_experimental_framebuffer_fetch` |
| * Requires fragment shader |
| * Requires T to be `i32`, `u32`, `f32`, `vec{2,3,4}{f,u,i}` |
| * Requires `N` to be unique per `color` |
| * The `N` value must be in the range of `[0..7]` |
| |
| ### Metal |
| |
| * `@color(N)` entries translate directly to `[[color(N)]]` annotations on the input data. |
| |
| ### Vulkan |
| |
| * Requires a `group`, `binding` value provided for each `color` `N` value from Host |
| * Add the `OpCapability InputAttachment` |
| * For each `color(N)` entry |
| * Create an `OpTypeImage %float SubpassData 0 0 0 2 Unknown` where `float` is the `f32`, `i32` or`u32` |
| * Create a `OpTypePointer UniformConstant %image` |
| * Create a `OpVariable %ptr_uniform_image UniformConstant` |
| * Decorate the var with `OpDecorate %inputVar InputAttachmentIndex N` |
| |
| * We will then replace the value of the input variable with the value read from the attachment |
| * `OpImageRead %v4float %img %zero` where `%zero` is `OpConstantComposite %v2int %int_0 %int_0` |
| |
| * For Dawn, this would probably map to creating the image in ShaderIO and then calling the |
| `image_read` intrinsic for SPIR-V |