diff options
Diffstat (limited to 'wgpu/src/shader')
| -rw-r--r-- | wgpu/src/shader/quad.wgsl | 107 | ||||
| -rw-r--r-- | wgpu/src/shader/triangle.wgsl | 105 | 
2 files changed, 102 insertions, 110 deletions
diff --git a/wgpu/src/shader/quad.wgsl b/wgpu/src/shader/quad.wgsl index 3232bdbe..fb402158 100644 --- a/wgpu/src/shader/quad.wgsl +++ b/wgpu/src/shader/quad.wgsl @@ -38,6 +38,13 @@ fn select_border_radius(radi: vec4<f32>, position: vec2<f32>, center: vec2<f32>)      return rx;  } +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>(rg.y, rg.x, ba.y, ba.x); +} +  struct SolidVertexInput {      @location(0) v_pos: vec2<f32>,      @location(1) color: vec4<f32>, @@ -140,40 +147,30 @@ fn solid_fs_main(  struct GradientVertexInput {      @location(0) v_pos: vec2<f32>, -    @location(1) color_1: vec4<f32>, -    @location(2) color_2: vec4<f32>, -    @location(3) color_3: vec4<f32>, -    @location(4) color_4: vec4<f32>, -    @location(5) color_5: vec4<f32>, -    @location(6) color_6: vec4<f32>, -    @location(7) color_7: vec4<f32>, -    @location(8) color_8: vec4<f32>, -    @location(9) offsets_1: vec4<f32>, -    @location(10) offsets_2: vec4<f32>, -    @location(11) direction: vec4<f32>, -    @location(12) position_and_scale: vec4<f32>, -    @location(13) border_color: vec4<f32>, -    @location(14) border_radius: vec4<f32>, -    @location(15) border_width: 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>, +    @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) color_1: vec4<f32>, -    @location(2) color_2: vec4<f32>, -    @location(3) color_3: vec4<f32>, -    @location(4) color_4: vec4<f32>, -    @location(5) color_5: vec4<f32>, -    @location(6) color_6: vec4<f32>, -    @location(7) color_7: vec4<f32>, -    @location(8) color_8: vec4<f32>, -    @location(9) offsets_1: vec4<f32>, -    @location(10) offsets_2: vec4<f32>, -    @location(11) direction: vec4<f32>, -    @location(12) position_and_scale: vec4<f32>, -    @location(13) border_color: vec4<f32>, -    @location(14) border_radius: vec4<f32>, -    @location(15) border_width: 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>, +    @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 @@ -199,16 +196,11 @@ fn gradient_vs_main(input: GradientVertexInput) -> GradientVertexOutput {      );      out.position = globals.transform * transform * vec4<f32>(input.v_pos, 0.0, 1.0); -    out.color_1 = input.color_1; -    out.color_2 = input.color_2; -    out.color_3 = input.color_3; -    out.color_4 = input.color_4; -    out.color_5 = input.color_5; -    out.color_6 = input.color_6; -    out.color_7 = input.color_7; -    out.color_8 = input.color_8; -    out.offsets_1 = input.offsets_1; -    out.offsets_2 = input.offsets_2; +    out.colors_1 = input.colors_1; +    out.colors_2 = input.colors_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; @@ -274,25 +266,28 @@ fn gradient(  @fragment  fn gradient_fs_main(input: GradientVertexOutput) -> @location(0) vec4<f32> {      let colors = array<vec4<f32>, 8>( -        input.color_1, -        input.color_2, -        input.color_3, -        input.color_4, -        input.color_5, -        input.color_6, -        input.color_7, -        input.color_8, +        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 625fa46e..9f512d14 100644 --- a/wgpu/src/shader/triangle.wgsl +++ b/wgpu/src/shader/triangle.wgsl @@ -4,6 +4,13 @@ struct Globals {  @group(0) @binding(0) var<uniform> globals: Globals; +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>(rg.y, rg.x, ba.y, ba.x); +} +  struct SolidVertexInput {      @location(0) position: vec2<f32>,      @location(1) color: vec4<f32>, @@ -29,52 +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) color_1: vec4<f32>, -    @location(2) color_2: vec4<f32>, -    @location(3) color_3: vec4<f32>, -    @location(4) color_4: vec4<f32>, -    @location(5) color_5: vec4<f32>, -    @location(6) color_6: vec4<f32>, -    @location(7) color_7: vec4<f32>, -    @location(8) color_8: vec4<f32>, -    @location(9) offsets_1: vec4<f32>, -    @location(10) offsets_2: vec4<f32>, -    @location(11) direction: vec4<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>,  }  @vertex -fn gradient_vs_main( -    @location(0) input: vec2<f32>, -    @location(1) color_1: vec4<f32>, -    @location(2) color_2: vec4<f32>, -    @location(3) color_3: vec4<f32>, -    @location(4) color_4: vec4<f32>, -    @location(5) color_5: vec4<f32>, -    @location(6) color_6: vec4<f32>, -    @location(7) color_7: vec4<f32>, -    @location(8) color_8: vec4<f32>, -    @location(9) offsets_1: vec4<f32>, -    @location(10) offsets_2: vec4<f32>, -    @location(11) 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.color_1 = color_1; -    output.color_2 = color_2; -    output.color_3 = color_3; -    output.color_4 = color_4; -    output.color_5 = color_5; -    output.color_6 = color_6; -    output.color_7 = color_7; -    output.color_8 = color_8; -    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;  } @@ -135,25 +129,28 @@ fn gradient(  @fragment  fn gradient_fs_main(input: GradientVertexOutput) -> @location(0) vec4<f32> {      let colors = array<vec4<f32>, 8>( -        input.color_1, -        input.color_2, -        input.color_3, -        input.color_4, -        input.color_5, -        input.color_6, -        input.color_7, -        input.color_8, +        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;  | 
