Skip to main content

runmat_plot/gpu/shaders/
area.rs

1pub const F32: &str = r#"
2const WORKGROUP_SIZE: u32 = {{WORKGROUP_SIZE}}u;
3struct VertexRaw { data: array<f32, 12u>, };
4struct Params { color: vec4<f32>, rows: u32, cols: u32, target_col: u32, baseline: f32, _pad0: f32, _pad1: f32, _pad2: f32, };
5@group(0) @binding(0) var<storage, read> buf_x: array<f32>;
6@group(0) @binding(1) var<storage, read> buf_y: array<f32>;
7@group(0) @binding(2) var<storage, read_write> out_vertices: array<VertexRaw>;
8@group(0) @binding(3) var<uniform> params: Params;
9fn write_vertex(index:u32, pos:vec3<f32>, color:vec4<f32>) { var v:VertexRaw; v.data[0u]=pos.x; v.data[1u]=pos.y; v.data[2u]=pos.z; v.data[3u]=color.x; v.data[4u]=color.y; v.data[5u]=color.z; v.data[6u]=color.w; v.data[7u]=0.0; v.data[8u]=0.0; v.data[9u]=1.0; v.data[10u]=0.0; v.data[11u]=0.0; out_vertices[index]=v; }
10fn y_at(col:u32,row:u32)->f32 { return buf_y[col * params.rows + row]; }
11fn lower_sum(row:u32)->f32 { var acc = params.baseline; var c:u32 = 0u; loop { if (c >= params.target_col) { break; } acc = acc + y_at(c,row); c = c + 1u; } return acc; }
12fn upper_sum(row:u32)->f32 { return lower_sum(row) + y_at(params.target_col,row); }
13@compute @workgroup_size(WORKGROUP_SIZE)
14fn main(@builtin(global_invocation_id) gid: vec3<u32>) { let i = gid.x; if (i + 1u >= params.rows) { return; } let x0 = buf_x[i]; let x1 = buf_x[i + 1u]; let l0 = lower_sum(i); let l1 = lower_sum(i + 1u); let u0 = upper_sum(i); let u1 = upper_sum(i + 1u); let base = i * 6u; write_vertex(base + 0u, vec3<f32>(x0,l0,0.0), params.color); write_vertex(base + 1u, vec3<f32>(x0,u0,0.0), params.color); write_vertex(base + 2u, vec3<f32>(x1,u1,0.0), params.color); write_vertex(base + 3u, vec3<f32>(x0,l0,0.0), params.color); write_vertex(base + 4u, vec3<f32>(x1,u1,0.0), params.color); write_vertex(base + 5u, vec3<f32>(x1,l1,0.0), params.color); }
15"#;
16
17pub const F64: &str = r#"
18const WORKGROUP_SIZE: u32 = {{WORKGROUP_SIZE}}u;
19struct VertexRaw { data: array<f32, 12u>, };
20struct Params { color: vec4<f32>, rows: u32, cols: u32, target_col: u32, baseline: f32, _pad0: f32, _pad1: f32, _pad2: f32, };
21@group(0) @binding(0) var<storage, read> buf_x: array<f64>;
22@group(0) @binding(1) var<storage, read> buf_y: array<f64>;
23@group(0) @binding(2) var<storage, read_write> out_vertices: array<VertexRaw>;
24@group(0) @binding(3) var<uniform> params: Params;
25fn write_vertex(index:u32, pos:vec3<f32>, color:vec4<f32>) { var v:VertexRaw; v.data[0u]=pos.x; v.data[1u]=pos.y; v.data[2u]=pos.z; v.data[3u]=color.x; v.data[4u]=color.y; v.data[5u]=color.z; v.data[6u]=color.w; v.data[7u]=0.0; v.data[8u]=0.0; v.data[9u]=1.0; v.data[10u]=0.0; v.data[11u]=0.0; out_vertices[index]=v; }
26fn y_at(col:u32,row:u32)->f32 { return f32(buf_y[col * params.rows + row]); }
27fn lower_sum(row:u32)->f32 { var acc = params.baseline; var c:u32 = 0u; loop { if (c >= params.target_col) { break; } acc = acc + y_at(c,row); c = c + 1u; } return acc; }
28fn upper_sum(row:u32)->f32 { return lower_sum(row) + y_at(params.target_col,row); }
29@compute @workgroup_size(WORKGROUP_SIZE)
30fn main(@builtin(global_invocation_id) gid: vec3<u32>) { let i = gid.x; if (i + 1u >= params.rows) { return; } let x0 = f32(buf_x[i]); let x1 = f32(buf_x[i + 1u]); let l0 = lower_sum(i); let l1 = lower_sum(i + 1u); let u0 = upper_sum(i); let u1 = upper_sum(i + 1u); let base = i * 6u; write_vertex(base + 0u, vec3<f32>(x0,l0,0.0), params.color); write_vertex(base + 1u, vec3<f32>(x0,u0,0.0), params.color); write_vertex(base + 2u, vec3<f32>(x1,u1,0.0), params.color); write_vertex(base + 3u, vec3<f32>(x0,l0,0.0), params.color); write_vertex(base + 4u, vec3<f32>(x1,u1,0.0), params.color); write_vertex(base + 5u, vec3<f32>(x1,l1,0.0), params.color); }
31"#;