blob: 67eaeca806f92d3840e6f1d9c7142b38fafbd645 [file] [log] [blame] [view] [edit]
# Sentinel Values {#SentinelValues}
## Undefined and Null
Since WebGPU is defined first as a JavaScript API, it uses the JavaScript value
`undefined` in many places to indicate the lack of a value.
This is usually used in dictionaries, where, for example, `{}` and
`{ powerPreference: undefined }` are equivalent, and distinct from both
`{ powerPreference: "high-performance" }` and `{ powerPreference: "low-power" }`.
It may also be used in functions/methods. For example, `GPUBuffer`'s
`getMappedRange(optional GPUSize64 offset = 0, optional GPUSize64 size)`
can be called equivalently as `b.getMappedRange()`, `b.getMappedRange(0)`,
`b.getMappedRange(undefined)`, or `b.getMappedRange(undefined, undefined)`.
To represent `undefined` in C, `webgpu.h` uses `NULL` where possible (anything
behind a pointer, including objects), `*_UNDEFINED` sentinel numeric values
(usually `UINT32_MAX` or similar), `*_Undefined` enum values (usually `0`),
or other semantic-specific names (like `WGPU_WHOLE_SIZE`).
The place that uses the type will define what to do with an undefined or
other sentinel value. It may be:
- Required, in which case an error is produced.
- Defaulting, in which case it trivially defaults to some other value.
- Optional, in which case the API accepts the sentinel value and handles it
(usually this is either a special value or it has more complex defaulting,
for example depending on other values).
## C-Specific Sentinel Values
Undefined and null values are also used in C-specific ways in place of
WebIDL's more flexible typing:
- \ref WGPUStringView has a special null value
- \ref WGPUFuture has a special null value
- Special cases to indicate the parent struct is null, avoiding extra layers of
pointers just for nullability:
- \ref WGPUVertexBufferLayout::stepMode = \ref WGPUVertexStepMode_Undefined with \ref WGPUVertexBufferLayout::attributeCount
- \ref WGPUBufferBindingLayout::type = \ref WGPUBufferBindingType_BindingNotUsed
- \ref WGPUSamplerBindingLayout::type = \ref WGPUSamplerBindingType_BindingNotUsed
- \ref WGPUTextureBindingLayout::sampleType = \ref WGPUTextureSampleType_BindingNotUsed
- \ref WGPUStorageTextureBindingLayout::access = \ref WGPUStorageTextureAccess_BindingNotUsed
- \ref WGPURenderPassColorAttachment::view = `NULL`
- \ref WGPUColorTargetState::format = \ref WGPUTextureFormat_Undefined
- \ref NullableFloatingPointType