// CNN v2 Layer Template (placeholder for generated shaders) // This file documents the structure - actual layers generated by export script // Example: Layer 0 (1×1 kernel, 8→16 channels) // const KERNEL_SIZE: u32 = 1u; // const IN_CHANNELS: u32 = 8u; // 7 features + bias // const OUT_CHANNELS: u32 = 16u; // const weights: array = array(...); @group(0) @binding(0) var static_features: texture_2d; @group(0) @binding(1) var layer_input: texture_2d; // Previous layer output @group(0) @binding(2) var output_tex: texture_storage_2d; fn unpack_static_features(coord: vec2) -> array { let packed = textureLoad(static_features, coord, 0); let v0 = unpack2x16float(packed.x); let v1 = unpack2x16float(packed.y); let v2 = unpack2x16float(packed.z); let v3 = unpack2x16float(packed.w); return array(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y, v3.x, v3.y); } fn unpack_layer_channels(coord: vec2) -> array { let packed = textureLoad(layer_input, coord, 0); let v0 = unpack2x16float(packed.x); let v1 = unpack2x16float(packed.y); let v2 = unpack2x16float(packed.z); let v3 = unpack2x16float(packed.w); return array(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y, v3.x, v3.y); } fn pack_channels(values: array) -> vec4 { return vec4( pack2x16float(vec2(values[0], values[1])), pack2x16float(vec2(values[2], values[3])), pack2x16float(vec2(values[4], values[5])), pack2x16float(vec2(values[6], values[7])) ); } @compute @workgroup_size(8, 8) fn main(@builtin(global_invocation_id) id: vec3) { let coord = vec2(id.xy); let dims = textureDimensions(static_features); if (coord.x >= i32(dims.x) || coord.y >= i32(dims.y)) { return; } // Load static features (always available) let static_feat = unpack_static_features(coord); // Convolution loop (example for generated code) // var output: array; // for (var c: u32 = 0u; c < OUT_CHANNELS; c++) { // var sum: f32 = 0.0; // for (var ky: i32 = -radius; ky <= radius; ky++) { // for (var kx: i32 = -radius; kx <= radius; kx++) { // let sample_coord = coord + vec2(kx, ky); // // Load static + prev layer, multiply weights, accumulate // } // } // output[c] = max(0.0, sum); // ReLU // } // Placeholder output textureStore(output_tex, coord, vec4(0u)); }