diff options
author | 2023-06-07 10:47:57 -0700 | |
---|---|---|
committer | 2023-06-07 11:18:26 -0700 | |
commit | 677f564f087b009842207e6df74aed343454ea17 (patch) | |
tree | c241fd569e1eacc07850618423c8d052c8405c77 /wgpu/src/shader/quad.wgsl | |
parent | 9554c78f3adc9846b76e9d3b96af06e98fb69aa0 (diff) | |
download | iced-677f564f087b009842207e6df74aed343454ea17.tar.gz iced-677f564f087b009842207e6df74aed343454ea17.tar.bz2 iced-677f564f087b009842207e6df74aed343454ea17.zip |
Switched to packing using f16s to maintain acceptable precision.
Diffstat (limited to '')
-rw-r--r-- | wgpu/src/shader/quad.wgsl | 77 |
1 files changed, 42 insertions, 35 deletions
diff --git a/wgpu/src/shader/quad.wgsl b/wgpu/src/shader/quad.wgsl index 5a1237e6..fb402158 100644 --- a/wgpu/src/shader/quad.wgsl +++ b/wgpu/src/shader/quad.wgsl @@ -38,10 +38,11 @@ fn select_border_radius(radi: vec4<f32>, position: vec2<f32>, center: vec2<f32>) return rx; } -fn unpack_u32(color: u32) -> vec4<f32> { - let u = unpack4x8unorm(color); +fn unpack_u32(color: vec2<u32>) -> vec4<f32> { + let rg: vec2<f32> = unpack2x16float(color.x); + let ba: vec2<f32> = unpack2x16float(color.y); - return vec4<f32>(u.w, u.z, u.y, u.x); + return vec4<f32>(rg.y, rg.x, ba.y, ba.x); } struct SolidVertexInput { @@ -148,26 +149,28 @@ struct GradientVertexInput { @location(0) v_pos: vec2<f32>, @location(1) colors_1: vec4<u32>, @location(2) colors_2: vec4<u32>, - @location(3) offsets_1: vec4<f32>, - @location(4) offsets_2: vec4<f32>, - @location(5) direction: vec4<f32>, - @location(6) position_and_scale: vec4<f32>, - @location(7) border_color: vec4<f32>, - @location(8) border_radius: vec4<f32>, - @location(9) border_width: f32, + @location(3) colors_3: vec4<u32>, + @location(4) colors_4: vec4<u32>, + @location(5) offsets: vec4<u32>, + @location(6) direction: vec4<f32>, + @location(7) position_and_scale: vec4<f32>, + @location(8) border_color: vec4<f32>, + @location(9) border_radius: vec4<f32>, + @location(10) border_width: f32, } struct GradientVertexOutput { @builtin(position) position: vec4<f32>, @location(1) colors_1: vec4<u32>, @location(2) colors_2: vec4<u32>, - @location(3) offsets_1: vec4<f32>, - @location(4) offsets_2: vec4<f32>, - @location(5) direction: vec4<f32>, - @location(6) position_and_scale: vec4<f32>, - @location(7) border_color: vec4<f32>, - @location(8) border_radius: vec4<f32>, - @location(9) border_width: f32, + @location(3) colors_3: vec4<u32>, + @location(4) colors_4: vec4<u32>, + @location(5) offsets: vec4<u32>, + @location(6) direction: vec4<f32>, + @location(7) position_and_scale: vec4<f32>, + @location(8) border_color: vec4<f32>, + @location(9) border_radius: vec4<f32>, + @location(10) border_width: f32, } @vertex @@ -195,8 +198,9 @@ fn gradient_vs_main(input: GradientVertexInput) -> GradientVertexOutput { out.position = globals.transform * transform * vec4<f32>(input.v_pos, 0.0, 1.0); out.colors_1 = input.colors_1; out.colors_2 = input.colors_2; - out.offsets_1 = input.offsets_1; - out.offsets_2 = input.offsets_2; + out.colors_3 = input.colors_3; + out.colors_4 = input.colors_4; + out.offsets = input.offsets; out.direction = input.direction * globals.scale; out.position_and_scale = vec4<f32>(pos, scale); out.border_color = input.border_color; @@ -262,25 +266,28 @@ fn gradient( @fragment fn gradient_fs_main(input: GradientVertexOutput) -> @location(0) vec4<f32> { let colors = array<vec4<f32>, 8>( - unpack_u32(input.colors_1.x), - unpack_u32(input.colors_1.y), - unpack_u32(input.colors_1.z), - unpack_u32(input.colors_1.w), - unpack_u32(input.colors_2.x), - unpack_u32(input.colors_2.y), - unpack_u32(input.colors_2.z), - unpack_u32(input.colors_2.w), + unpack_u32(input.colors_1.xy), + unpack_u32(input.colors_1.zw), + unpack_u32(input.colors_2.xy), + unpack_u32(input.colors_2.zw), + unpack_u32(input.colors_3.xy), + unpack_u32(input.colors_3.zw), + unpack_u32(input.colors_4.xy), + unpack_u32(input.colors_4.zw), ); + let offsets_1: vec4<f32> = unpack_u32(input.offsets.xy); + let offsets_2: vec4<f32> = unpack_u32(input.offsets.zw); + var offsets = array<f32, 8>( - input.offsets_1.x, - input.offsets_1.y, - input.offsets_1.z, - input.offsets_1.w, - input.offsets_2.x, - input.offsets_2.y, - input.offsets_2.z, - input.offsets_2.w, + offsets_1.x, + offsets_1.y, + offsets_1.z, + offsets_1.w, + offsets_2.x, + offsets_2.y, + offsets_2.z, + offsets_2.w, ); //TODO could just pass this in to the shader but is probably more performant to just check it here |