Expand description
Utility for normalizing GPU timestamp queries to have a consistent 1GHz period. This uses a compute shader to do the normalization, so the timestamps exist in their correct format on the GPU, as is required by the WebGPU specification.
§Algorithm
The fundamental operation is multiplying a u64 timestamp by an f32 value. We have neither f64s nor u64s in shaders, so we need to do something more complicated.
We first decompose the f32 into a u32 fraction where the denominator is a power of two. We do the computation with f64 for ease of computation, as those can store u32s losslessly.
Because the denominator is a power of two, this means the shader can evaluate this divide by using a shift. Additionally, we always choose the largest denominator we can, so that the fraction is as precise as possible.
To evaluate this function, we have two helper operations (both in common.wgsl).
u64_mul_u32
multiplies a u64 by a u32 and returns a u96.shift_right_u96
shifts a u96 right by a given amount, returning a u96.
See their implementations for more details.
We then multiply the timestamp by the numerator, and shift it right by the denominator. This gives us the normalized timestamp.
Structs§
- Normalizes GPU timestamps to have a consistent 1GHz period. See module documentation for more information.