This CL adds the start of a document listing how things translate into various backends. Change-Id: Iebeb4488450b4f299e83d0de7ee124b441795e98 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/31240 Reviewed-by: David Neto <dneto@google.com> Commit-Queue: dan sinclair <dsinclair@chromium.org>
4.9 KiB
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_idx | SpvBuiltInVertexIndex |vertex_id | SV_VertexID instance_idx | 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_idx | 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 outerProduct | SpvOpOuterProduct | | 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
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>)]]