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/quad.wgsl | 87 ++++++++++++++++++++----------------------- wgpu/src/shader/triangle.wgsl | 71 ++++++++++++++++------------------- 2 files changed, 74 insertions(+), 84 deletions(-) (limited to 'wgpu/src/shader') diff --git a/wgpu/src/shader/quad.wgsl b/wgpu/src/shader/quad.wgsl index 3232bdbe..fdcc6743 100644 --- a/wgpu/src/shader/quad.wgsl +++ b/wgpu/src/shader/quad.wgsl @@ -38,6 +38,19 @@ fn select_border_radius(radi: vec4, position: vec2, center: vec2) return rx; } +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) v_pos: vec2, @location(1) color: vec4, @@ -140,40 +153,28 @@ fn solid_fs_main( struct GradientVertexInput { @location(0) v_pos: 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(12) position_and_scale: vec4, - @location(13) border_color: vec4, - @location(14) border_radius: vec4, - @location(15) border_width: f32 + @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(6) position_and_scale: vec4, + @location(7) border_color: vec4, + @location(8) border_radius: vec4, + @location(9) border_width: f32, } struct GradientVertexOutput { @builtin(position) position: vec4, - @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(12) position_and_scale: vec4, - @location(13) border_color: vec4, - @location(14) border_radius: vec4, - @location(15) border_width: f32 + @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(6) position_and_scale: vec4, + @location(7) border_color: vec4, + @location(8) border_radius: vec4, + @location(9) border_width: f32, } @vertex @@ -199,14 +200,8 @@ fn gradient_vs_main(input: GradientVertexInput) -> GradientVertexOutput { ); out.position = globals.transform * transform * vec4(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.colors_1 = input.colors_1; + out.colors_2 = input.colors_2; out.offsets_1 = input.offsets_1; out.offsets_2 = input.offsets_2; out.direction = input.direction * globals.scale; @@ -274,14 +269,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( 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