diff options
| author | 2023-06-07 10:47:57 -0700 | |
|---|---|---|
| committer | 2023-06-07 11:18:26 -0700 | |
| commit | 677f564f087b009842207e6df74aed343454ea17 (patch) | |
| tree | c241fd569e1eacc07850618423c8d052c8405c77 /wgpu | |
| 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 'wgpu')
| -rw-r--r-- | wgpu/src/quad/gradient.rs | 24 | ||||
| -rw-r--r-- | wgpu/src/shader/quad.wgsl | 77 | ||||
| -rw-r--r-- | wgpu/src/shader/triangle.wgsl | 83 | ||||
| -rw-r--r-- | wgpu/src/triangle.rs | 16 | 
4 files changed, 110 insertions, 90 deletions
diff --git a/wgpu/src/quad/gradient.rs b/wgpu/src/quad/gradient.rs index 1b45c9f4..6db37252 100644 --- a/wgpu/src/quad/gradient.rs +++ b/wgpu/src/quad/gradient.rs @@ -96,24 +96,26 @@ impl Pipeline {                                  as u64,                              step_mode: wgpu::VertexStepMode::Instance,                              attributes: &wgpu::vertex_attr_array!( -                                // Colors 1-4 +                                // Colors 1-2                                  1 => Uint32x4, -                                // Colors 5-8 +                                // Colors 3-4                                  2 => Uint32x4, -                                // Offsets 1-4 -                                3 => Float32x4, -                                // Offsets 5-8 -                                4 => Float32x4, +                                // Colors 5-6 +                                3 => Uint32x4, +                                // Colors 7-8 +                                4 => Uint32x4, +                                // Offsets 1-8 +                                5 => Uint32x4,                                  // Direction -                                5 => Float32x4, -                                // Position & Scale                                  6 => Float32x4, -                                // Border color +                                // Position & Scale                                  7 => Float32x4, -                                // Border radius +                                // Border color                                  8 => Float32x4, +                                // Border radius +                                9 => Float32x4,                                  // Border width -                                9 => Float32 +                                10 => Float32                              ),                          },                      ], 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 diff --git a/wgpu/src/shader/triangle.wgsl b/wgpu/src/shader/triangle.wgsl index f1bb2733..9f512d14 100644 --- a/wgpu/src/shader/triangle.wgsl +++ b/wgpu/src/shader/triangle.wgsl @@ -4,10 +4,11 @@ struct Globals {  @group(0) @binding(0) var<uniform> globals: Globals; -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 { @@ -35,34 +36,39 @@ fn solid_fs_main(input: SolidVertexOutput) -> @location(0) vec4<f32> {      return input.color;  } +struct GradientVertexInput { +    @location(0) v_pos: vec2<f32>, +    @location(1) colors_1: vec4<u32>, +    @location(2) colors_2: vec4<u32>, +    @location(3) colors_3: vec4<u32>, +    @location(4) colors_4: vec4<u32>, +    @location(5) offsets: vec4<u32>, +    @location(6) direction: vec4<f32>, +} +  struct GradientVertexOutput {      @builtin(position) position: vec4<f32>,      @location(0) raw_position: 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(3) colors_3: vec4<u32>, +    @location(4) colors_4: vec4<u32>, +    @location(5) offsets: vec4<u32>, +    @location(6) direction: vec4<f32>,  }  @vertex -fn gradient_vs_main( -    @location(0) input: 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>, -) -> GradientVertexOutput { +fn gradient_vs_main(input: GradientVertexInput) -> GradientVertexOutput {      var output: GradientVertexOutput; -    output.position = globals.transform * vec4<f32>(input.xy, 0.0, 1.0); -    output.raw_position = input; -    output.colors_1 = colors_1; -    output.colors_2 = colors_2; -    output.offsets_1 = offsets_1; -    output.offsets_2 = offsets_2; -    output.direction = direction; +    output.position = globals.transform * vec4<f32>(input.v_pos, 0.0, 1.0); +    output.raw_position = input.v_pos; +    output.colors_1 = input.colors_1; +    output.colors_2 = input.colors_2; +    output.colors_3 = input.colors_3; +    output.colors_4 = input.colors_4; +    output.offsets = input.offsets; +    output.direction = input.direction;      return output;  } @@ -123,25 +129,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,      );      var last_index = 7; diff --git a/wgpu/src/triangle.rs b/wgpu/src/triangle.rs index 3f633e14..3f3635cf 100644 --- a/wgpu/src/triangle.rs +++ b/wgpu/src/triangle.rs @@ -652,16 +652,18 @@ mod gradient {                              attributes: &wgpu::vertex_attr_array!(                                  // Position                                  0 => Float32x2, -                                // Colors 1-4 +                                // Colors 1-2                                  1 => Uint32x4, -                                // Colors 5-8, +                                // Colors 3-4                                  2 => Uint32x4, -                                // Offsets 1-4 -                                3 => Float32x4, -                                // Offsets 5-8 -                                4 => Float32x4, +                                // Colors 5-6 +                                3 => Uint32x4, +                                // Colors 7-8 +                                4 => Uint32x4, +                                // Offsets +                                5 => Uint32x4,                                  // Direction -                                5 => Float32x4 +                                6 => Float32x4                              ),                          }],                      },  | 
