dawn-cmake/docs/tint/translations.md

8.0 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_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_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_depth_multisampled_2d OpTypeImage 2D Depth=1 MS=1 Sampled=1 depth2d<float, access::sample> Texture2DMSArray
texture_storage_1d<image_storage_type> OpTypeImage 1D Sampled=2 texture1d<type, access::read> RWTexture1D
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_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>)