From ea7f2626b11af249510b27001fb6addd7f9210a9 Mon Sep 17 00:00:00 2001 From: Bingus Date: Mon, 29 May 2023 16:44:56 -0700 Subject: Optimized gradient data packing. --- wgpu/src/shader/triangle.wgsl | 71 ++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 38 deletions(-) (limited to 'wgpu/src/shader/triangle.wgsl') diff --git a/wgpu/src/shader/triangle.wgsl b/wgpu/src/shader/triangle.wgsl index 625fa46e..5a73a77f 100644 --- a/wgpu/src/shader/triangle.wgsl +++ b/wgpu/src/shader/triangle.wgsl @@ -4,6 +4,19 @@ struct Globals { @group(0) @binding(0) var globals: Globals; +fn l(c: f32) -> f32 { + if (c < 0.04045) { + return c / 12.92; + } else { + return pow(((c + 0.055) / 1.055), 2.4); + }; +} + +fn to_linear(color: u32) -> vec4 { + let c = unpack4x8unorm(color); //unpacks as a b g r + return vec4(l(c.w), l(c.z), l(c.y), c.x); +} + struct SolidVertexInput { @location(0) position: vec2, @location(1) color: vec4, @@ -32,46 +45,28 @@ fn solid_fs_main(input: SolidVertexOutput) -> @location(0) vec4 { struct GradientVertexOutput { @builtin(position) position: vec4, @location(0) raw_position: vec2, - @location(1) color_1: vec4, - @location(2) color_2: vec4, - @location(3) color_3: vec4, - @location(4) color_4: vec4, - @location(5) color_5: vec4, - @location(6) color_6: vec4, - @location(7) color_7: vec4, - @location(8) color_8: vec4, - @location(9) offsets_1: vec4, - @location(10) offsets_2: vec4, - @location(11) direction: vec4, + @location(1) colors_1: vec4, + @location(2) colors_2: vec4, + @location(3) offsets_1: vec4, + @location(4) offsets_2: vec4, + @location(5) direction: vec4, } @vertex fn gradient_vs_main( @location(0) input: vec2, - @location(1) color_1: vec4, - @location(2) color_2: vec4, - @location(3) color_3: vec4, - @location(4) color_4: vec4, - @location(5) color_5: vec4, - @location(6) color_6: vec4, - @location(7) color_7: vec4, - @location(8) color_8: vec4, - @location(9) offsets_1: vec4, - @location(10) offsets_2: vec4, - @location(11) direction: vec4, + @location(1) colors_1: vec4, + @location(2) colors_2: vec4, + @location(3) offsets_1: vec4, + @location(4) offsets_2: vec4, + @location(5) direction: vec4, ) -> GradientVertexOutput { var output: GradientVertexOutput; output.position = globals.transform * vec4(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.colors_1 = colors_1; + output.colors_2 = colors_2; output.offsets_1 = offsets_1; output.offsets_2 = offsets_2; output.direction = direction; @@ -135,14 +130,14 @@ fn gradient( @fragment fn gradient_fs_main(input: GradientVertexOutput) -> @location(0) vec4 { let colors = array, 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, + to_linear(input.colors_1.x), + to_linear(input.colors_1.y), + to_linear(input.colors_1.z), + to_linear(input.colors_1.w), + to_linear(input.colors_2.x), + to_linear(input.colors_2.y), + to_linear(input.colors_2.z), + to_linear(input.colors_2.w), ); var offsets = array( -- cgit From 9554c78f3adc9846b76e9d3b96af06e98fb69aa0 Mon Sep 17 00:00:00 2001 From: Bingus Date: Tue, 6 Jun 2023 17:06:40 -0700 Subject: Updated color packing into u32 to consider incorrect web-colors. --- wgpu/src/shader/triangle.wgsl | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) (limited to 'wgpu/src/shader/triangle.wgsl') diff --git a/wgpu/src/shader/triangle.wgsl b/wgpu/src/shader/triangle.wgsl index 5a73a77f..f1bb2733 100644 --- a/wgpu/src/shader/triangle.wgsl +++ b/wgpu/src/shader/triangle.wgsl @@ -4,17 +4,10 @@ struct Globals { @group(0) @binding(0) var globals: Globals; -fn l(c: f32) -> f32 { - if (c < 0.04045) { - return c / 12.92; - } else { - return pow(((c + 0.055) / 1.055), 2.4); - }; -} +fn unpack_u32(color: u32) -> vec4 { + let u = unpack4x8unorm(color); -fn to_linear(color: u32) -> vec4 { - let c = unpack4x8unorm(color); //unpacks as a b g r - return vec4(l(c.w), l(c.z), l(c.y), c.x); + return vec4(u.w, u.z, u.y, u.x); } struct SolidVertexInput { @@ -130,14 +123,14 @@ fn gradient( @fragment fn gradient_fs_main(input: GradientVertexOutput) -> @location(0) vec4 { let colors = array, 8>( - to_linear(input.colors_1.x), - to_linear(input.colors_1.y), - to_linear(input.colors_1.z), - to_linear(input.colors_1.w), - to_linear(input.colors_2.x), - to_linear(input.colors_2.y), - to_linear(input.colors_2.z), - to_linear(input.colors_2.w), + 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), ); var offsets = array( -- cgit From 677f564f087b009842207e6df74aed343454ea17 Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 7 Jun 2023 10:47:57 -0700 Subject: Switched to packing using f16s to maintain acceptable precision. --- wgpu/src/shader/triangle.wgsl | 83 ++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 37 deletions(-) (limited to 'wgpu/src/shader/triangle.wgsl') 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 globals: Globals; -fn unpack_u32(color: u32) -> vec4 { - let u = unpack4x8unorm(color); +fn unpack_u32(color: vec2) -> vec4 { + let rg: vec2 = unpack2x16float(color.x); + let ba: vec2 = unpack2x16float(color.y); - return vec4(u.w, u.z, u.y, u.x); + return vec4(rg.y, rg.x, ba.y, ba.x); } struct SolidVertexInput { @@ -35,34 +36,39 @@ fn solid_fs_main(input: SolidVertexOutput) -> @location(0) vec4 { return input.color; } +struct GradientVertexInput { + @location(0) v_pos: vec2, + @location(1) colors_1: vec4, + @location(2) colors_2: vec4, + @location(3) colors_3: vec4, + @location(4) colors_4: vec4, + @location(5) offsets: vec4, + @location(6) direction: vec4, +} + struct GradientVertexOutput { @builtin(position) position: vec4, @location(0) raw_position: vec2, @location(1) colors_1: vec4, @location(2) colors_2: vec4, - @location(3) offsets_1: vec4, - @location(4) offsets_2: vec4, - @location(5) direction: vec4, + @location(3) colors_3: vec4, + @location(4) colors_4: vec4, + @location(5) offsets: vec4, + @location(6) direction: vec4, } @vertex -fn gradient_vs_main( - @location(0) input: vec2, - @location(1) colors_1: vec4, - @location(2) colors_2: vec4, - @location(3) offsets_1: vec4, - @location(4) offsets_2: vec4, - @location(5) direction: vec4, -) -> GradientVertexOutput { +fn gradient_vs_main(input: GradientVertexInput) -> GradientVertexOutput { var output: GradientVertexOutput; - output.position = globals.transform * vec4(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(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 { let colors = array, 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 = unpack_u32(input.offsets.xy); + let offsets_2: vec4 = unpack_u32(input.offsets.zw); + var offsets = array( - 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; -- cgit