pub const RING_KERNEL_WGSL_TEMPLATE: &str = r#"
// RingKernel WGSL Template
// Generated by ringkernel-wgpu
// Control block binding
struct ControlBlock {
is_active: u32,
should_terminate: u32,
has_terminated: u32,
_pad1: u32,
messages_processed_lo: u32,
messages_processed_hi: u32,
messages_in_flight_lo: u32,
messages_in_flight_hi: u32,
input_head_lo: u32,
input_head_hi: u32,
input_tail_lo: u32,
input_tail_hi: u32,
output_head_lo: u32,
output_head_hi: u32,
output_tail_lo: u32,
output_tail_hi: u32,
input_capacity: u32,
output_capacity: u32,
input_mask: u32,
output_mask: u32,
// HLC state (split for WGSL u32 limitation)
hlc_physical_lo: u32,
hlc_physical_hi: u32,
hlc_logical_lo: u32,
hlc_logical_hi: u32,
last_error: u32,
error_count: u32,
}
@group(0) @binding(0) var<storage, read_write> control: ControlBlock;
@group(0) @binding(1) var<storage, read_write> input_queue: array<u32>;
@group(0) @binding(2) var<storage, read_write> output_queue: array<u32>;
// Thread identification
var<private> thread_id: u32;
var<private> workgroup_id: u32;
@compute @workgroup_size(256)
fn main(@builtin(global_invocation_id) global_id: vec3<u32>,
@builtin(workgroup_id) wg_id: vec3<u32>,
@builtin(local_invocation_id) local_id: vec3<u32>) {
thread_id = local_id.x;
workgroup_id = wg_id.x;
// Check if kernel should process
if (control.is_active == 0u) {
return;
}
// User kernel code will be inserted here
// USER_KERNEL_CODE
// Update message counter (simplified without 64-bit atomics)
if (thread_id == 0u) {
control.messages_processed_lo = control.messages_processed_lo + 1u;
if (control.messages_processed_lo == 0u) {
control.messages_processed_hi = control.messages_processed_hi + 1u;
}
}
}
"#;Expand description
WGSL shader template for ring kernel.