194 lines
8.3 KiB
Markdown
194 lines
8.3 KiB
Markdown
# Translations
|
|
|
|
This document attempts to document how WGSL translates into the various backends
|
|
for the cases where the translation is not a direct mapping.
|
|
|
|
# Access Control
|
|
|
|
## HLSL
|
|
* ReadOnly -> `ByteAddressBuffer`
|
|
* ReadWrite -> `RWByteAddressBuffer`
|
|
|
|
## MSL
|
|
* ReadOnly -> `const`
|
|
|
|
## SPIR-V
|
|
There are two ways this can be achieved in SPIR-V. Either the variable can be
|
|
decorated with `NonWritable` or each member of the struct can be decorated with
|
|
`NonWritable`. We chose to go the struct member route.
|
|
* The read-only becomes part of the type in this case. Otherwise, you are
|
|
treating the readonly type information as part of the variable which is
|
|
confusing.
|
|
* Treating the readonly as part of the variable means we should be
|
|
deduplicating the types behind the access control, which causes confusing
|
|
with the type_names and various tracking systems within Tint.
|
|
|
|
|
|
# Builtin Decorations
|
|
| Name | SPIR-V | MSL | HLSL |
|
|
|------|--------|-----|------|
|
|
| position | SpvBuiltInPosition |position | SV_Position |
|
|
| vertex_index | SpvBuiltInVertexIndex |vertex_id | SV_VertexID |
|
|
| instance_index | SpvBuiltInInstanceIndex | instance_id| SV_InstanceID |
|
|
| front_facing | SpvBuiltInFrontFacing | front_facing | SV_IsFrontFacing |
|
|
| frag_coord | SpvBuiltInFragCoord | position | SV_Position |
|
|
| frag_depth | SpvBuiltInFragDepth | depth(any) | SV_Depth |
|
|
| local_invocation_id | SpvBuiltInLocalInvocationId | thread_position_in_threadgroup | SV_GroupThreadID |
|
|
| local_invocation_index | SpvBuiltInLocalInvocationIndex | thread_index_in_threadgroup | SV_GroupIndex |
|
|
| global_invocation_id | SpvBuiltInGlobalInvocationId | thread_position_in_grid | SV_DispatchThreadID |
|
|
|
|
|
|
# Builtins Methods
|
|
| Name | SPIR-V | MSL | HLSL |
|
|
| ------|--------|-----|------ |
|
|
| abs | GLSLstd450FAbs or GLSLstd450SAbs| fabs or abs | abs |
|
|
| acos | GLSLstd450Acos | acos | acos |
|
|
| all | SpvOpAll | all | all |
|
|
| any | SpvOpAny | any | any |
|
|
| arrayLength | SpvOpArrayLength | | |
|
|
| asin | GLSLstd450Asin | asin | asin |
|
|
| atan | GLSLstd450Atan | atan | atan |
|
|
| atan2 | GLSLstd450Atan2| atan2 | atan2 |
|
|
| ceil | GLSLstd450Ceil| ceil | ceil |
|
|
| clamp | GLSLstd450NClamp or GLSLstd450UClamp or GLSLstd450SClamp| clamp | clamp |
|
|
| cos | GLSLstd450Cos | cos | cos |
|
|
| cosh | GLSLstd450Cosh | cosh | cosh |
|
|
| countOneBits | SpvOpBitCount | popcount | countbits |
|
|
| cross | GLSLstd450Cross | cross | cross |
|
|
| determinant | GLSLstd450Determinant | determinant | determinant |
|
|
| distance | GLSLstd450Distance | distance | distance |
|
|
| dot | SpOpDot | dot | dot |
|
|
| dpdx | SpvOpDPdx | dpdx | ddx |
|
|
| dpdxCoarse | SpvOpDPdxCoarse | dpdx | ddx_coarse |
|
|
| dpdxFine | SpvOpDPdxFine | dpdx | ddx_fine |
|
|
| dpdy | SpvOpDPdy | dpdy | ddy |
|
|
| dpdyCoarse | SpvOpDPdyCoarse | dpdy | ddy_coarse |
|
|
| dpdyFine | SpvOpDPdyFine | dpdy | ddy_fine |
|
|
| exp | GLSLstd450Exp | exp | exp |
|
|
| exp2 | GLSLstd450Exp2 | exp2 | exp2 |
|
|
| faceForward | GLSLstd450FaceForward | faceforward | faceforward |
|
|
| floor | GLSLstd450Floor | floor | floor |
|
|
| fma | GLSLstd450Fma | fma | fma |
|
|
| fract | GLSLstd450Fract | fract | frac |
|
|
| frexp | GLSLstd450Frexp | | |
|
|
| fwidth | SpvOpFwidth | fwidth | fwidth |
|
|
| fwidthCoarse | SpvOpFwidthCoarse | fwidth | fwidth |
|
|
| fwidthFine | SpvOpFwidthFine | fwidth | fwidth |
|
|
| inverseSqrt | GLSLstd450InverseSqrt | rsqrt | rsqrt |
|
|
| isFinite | | isfinite | isfinite |
|
|
| isInf | SpvOpIsInf | isinf | isinf |
|
|
| isNan | SpvOpIsNan | isnan | isnan |
|
|
| isNormal | | isnormal | |
|
|
| ldexp | GLSLstd450Ldexp | | |
|
|
| length | GLSLstd450Length | length | length |
|
|
| log | GLSLstd450Log | log | log |
|
|
| log2 | GLSLstd450Log2 | log2 | log2 |
|
|
| max | GLSLstd450NMax or GLSLstd450SMax or GLSLstd450UMax | fmax or max | max |
|
|
| min | GLSLstd450NMin or GLSLstd450SMin or GLSLstd450UMin | fmin or min | min |
|
|
| mix | GLSLstd450FMix | mix | mix |
|
|
| modf | GLSLstd450Modf | | |
|
|
| normalize | GLSLstd450Normalize | normalize | normalize |
|
|
| pow | GLSLstd450Pow | pow | pow |
|
|
| reflect | GLSLstd450Reflect | reflect | reflect |
|
|
| reverseBits | SpvOpBitReverse | reverse_bits | reversebits |
|
|
| round | GLSLstd450Round | round | round |
|
|
| select | SpvOpSelect | select | |
|
|
| sign | GLSLstd450FSign | sign | sign |
|
|
| sin | GLSLstd450Sin | sin | sin |
|
|
| sinh | GLSLstd450Sinh | sinh | sinh |
|
|
| smoothStep | GLSLstd450SmoothStep | smoothstep | smoothstep |
|
|
| sqrt | GLSLstd450Sqrt | sqrt | sqrt |
|
|
| step | GLSLstd450Step | step | step |
|
|
| tan | GLSLstd450Tan | tan | tan |
|
|
| tanh | GLSLstd450Tanh | tanh | tanh |
|
|
| trunc | GLSLstd450Trunc | trunc | trunc |
|
|
|
|
# Types
|
|
## Sampler Types
|
|
| WGSL | SPIR-V | MSL | HLSL |
|
|
|------|--------|-----|------|
|
|
| sampler | OpTypeSampler | sampler | SamplerState |
|
|
| sampler_comparison | OpTypeSampler | sampler | SamplerComparisonState |
|
|
|
|
## Texture Types
|
|
| WGSL | SPIR-V | MSL | HLSL |
|
|
|------|--------|-----|------|
|
|
| texture_1d<type> | OpTypeImage 1D Sampled=1 | texture1d<type, access::sample> | Texture1D |
|
|
| texture_1d_array<type> | OpTypeImage 1D Arrayed=1 Sampled=1 | texture1d_array<type, access::sample> | Texture1DArray |
|
|
| texture_2d<type> | OpTypeImage 2D Sampled=1 | texture2d<type, access::sample> | Texture2D |
|
|
| texture_2d_array<type> | OpTypeImage 2D Arrayed=1 Sampled=1 | texture2d_array<type, access::sample> | Texture2DArray |
|
|
| texture_3d<type> | OpTypeImage 3D Sampled=1 | texture3d<type, access::sample> | Texture3D |
|
|
| texture_cube<type> | OpTypeImage Cube Sampled=1 | texturecube<type, access::sample> | TextureCube |
|
|
| texture_cube_array<type> | OpTypeImage Cube Arrayed=1 Sampled=1 | texturecube_array<type, access::sample> | TextureCubeArray |
|
|
| | | |
|
|
| texture_multisampled_2d<type> | OpTypeImage 2D MS=1 Sampled=1 | texture2d_ms<type, access::sample> | Texture2D |
|
|
| | | |
|
|
| texture_depth_2d | OpTypeImage 2D Depth=1 Sampled=1 | depth2d<float, access::sample>| Texture2D |
|
|
| texture_depth_2d_array | OpTypeImage 2D Depth=1 Arrayed=1 Sampled=1 | depth2d_array<float, access::sample> | Texture2DArray |
|
|
| texture_depth_cube | OpTypeImage Cube Depth=1 Sampled=1 | depthcube<float, access::sample> | TextureCube |
|
|
| texture_depth_cube_array | OpTypeImage Cube Depth=1 Arrayed=1 Sampled=1 | depthcube_array<float, access::sample> | TextureCubeArray |
|
|
| | | |
|
|
| texture_storage_1d<image_storage_type> | OpTypeImage 1D Sampled=2| texture1d<type, access::read> | RWTexture1D |
|
|
| texture_storage_1d_array<image_storage_type> | OpTypeImage 1D Arrayed=1 Sampled=2 | texture1d_array<type, access::read> | RWTexture1DArray |
|
|
| texture_storage_2d<image_storage_type> | OpTypeImage 2D Sampled=2 | texture2d<type, access::read> | RWTexture2D |
|
|
| texture_storage_2d_array<image_storage_type> | OpTypeImage 2D Arrayed=1 Sampled=2 | texture2d_array<type, access::read> | RWTexture2DArray |
|
|
| texture_storage_3d<image_storage_type> | OpTypeImage 3D Sampled=2 | texture3d<type, access::read> | RWTexture3D |
|
|
| | | |
|
|
| texture_storage_1d<image_storage_type> | OpTypeImage 1D Sampled=2 | texture1d<type, access::write> | RWTexture1D |
|
|
| texture_storage_1d_array<image_storage_type> | OpTypeImage 1D Arrayed=1 Sampled=2 | texture1d_array<type, access::write> | RWTexture1DArray |
|
|
| texture_storage_2d<image_storage_type> | OpTypeImage 2D Sampled=1 | texture2d<type, access::write> | RWTexture2D |
|
|
| texture_storage_2d_array<image_storage_type> | OpTypeImage 2D Arrayed=1 Sampled=2 | texture2d_array<type, access::write> | RWTexture2DArray |
|
|
| texture_storage_3d<image_storage_type> | OpTypeImage 3D Sampled=2 | texture3d<type, access::write> | RWTexture3D|
|
|
|
|
# Short-circuting
|
|
## HLSL
|
|
TODO(dsinclair): Nested if's
|
|
|
|
## SPIR-V
|
|
TODO(dsinclair): Nested if's
|
|
|
|
# Storage classes
|
|
TODO(dsinclair): do ...
|
|
|
|
# Storage buffers
|
|
## HLSL
|
|
TODO(dsinclair): Rewriting of accessors to loads
|
|
|
|
# Loop blocks
|
|
## HLSL
|
|
TODO(dsinclair): Rewrite with bools
|
|
|
|
## MSL
|
|
TODO(dsinclair): Rewrite with bools
|
|
|
|
# Input / Output storage class
|
|
## HLSL
|
|
TODO(dsinclair): Structs and params
|
|
|
|
## MSL
|
|
TODO(dsinclair): Structs and params
|
|
|
|
# Discard
|
|
## HLSL
|
|
* `discard`
|
|
|
|
## MSL
|
|
* `discard_fragment()`
|
|
|
|
|
|
# Specialization constants
|
|
## HLSL
|
|
```
|
|
#ifndef WGSL_SPEC_CONSTANT_<id>
|
|
-- if default provided
|
|
#define WGSL_SPEC_CONSTANT_<id> default value
|
|
-- else
|
|
#error spec constant required for constant id
|
|
--
|
|
#endif
|
|
static const <type> <name> = WGSL_SPEC_CONSTANT_<id>
|
|
```
|
|
|
|
## MSL
|
|
`[[function_constant(<id>)]]`
|