# Objective - When adding/removing bindings in large binding lists, git would generate very difficult-to-read diffs ## Solution - Move the `@group(X) @binding(Y)` into the same line as the binding type declaration
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			WebGPU Shading Language
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			WebGPU Shading Language
		
	
	
	
	
	
@group(0) @binding(0) var texture: texture_storage_2d<rgba8unorm, read_write>;
 | 
						|
 | 
						|
fn hash(value: u32) -> u32 {
 | 
						|
    var state = value;
 | 
						|
    state = state ^ 2747636419u;
 | 
						|
    state = state * 2654435769u;
 | 
						|
    state = state ^ state >> 16u;
 | 
						|
    state = state * 2654435769u;
 | 
						|
    state = state ^ state >> 16u;
 | 
						|
    state = state * 2654435769u;
 | 
						|
    return state;
 | 
						|
}
 | 
						|
 | 
						|
fn randomFloat(value: u32) -> f32 {
 | 
						|
    return f32(hash(value)) / 4294967295.0;
 | 
						|
}
 | 
						|
 | 
						|
@compute @workgroup_size(8, 8, 1)
 | 
						|
fn init(@builtin(global_invocation_id) invocation_id: vec3<u32>, @builtin(num_workgroups) num_workgroups: vec3<u32>) {
 | 
						|
    let location = vec2<i32>(i32(invocation_id.x), i32(invocation_id.y));
 | 
						|
 | 
						|
    let randomNumber = randomFloat(invocation_id.y * num_workgroups.x + invocation_id.x);
 | 
						|
    let alive = randomNumber > 0.9;
 | 
						|
    let color = vec4<f32>(f32(alive));
 | 
						|
 | 
						|
    textureStore(texture, location, color);
 | 
						|
}
 | 
						|
 | 
						|
fn is_alive(location: vec2<i32>, offset_x: i32, offset_y: i32) -> i32 {
 | 
						|
    let value: vec4<f32> = textureLoad(texture, location + vec2<i32>(offset_x, offset_y));
 | 
						|
    return i32(value.x);
 | 
						|
}
 | 
						|
 | 
						|
fn count_alive(location: vec2<i32>) -> i32 {
 | 
						|
    return is_alive(location, -1, -1) +
 | 
						|
           is_alive(location, -1,  0) +
 | 
						|
           is_alive(location, -1,  1) +
 | 
						|
           is_alive(location,  0, -1) +
 | 
						|
           is_alive(location,  0,  1) +
 | 
						|
           is_alive(location,  1, -1) +
 | 
						|
           is_alive(location,  1,  0) +
 | 
						|
           is_alive(location,  1,  1);
 | 
						|
}
 | 
						|
 | 
						|
@compute @workgroup_size(8, 8, 1)
 | 
						|
fn update(@builtin(global_invocation_id) invocation_id: vec3<u32>) {
 | 
						|
    let location = vec2<i32>(i32(invocation_id.x), i32(invocation_id.y));
 | 
						|
 | 
						|
    let n_alive = count_alive(location);
 | 
						|
 | 
						|
    var alive: bool;
 | 
						|
    if (n_alive == 3) {
 | 
						|
        alive = true;
 | 
						|
    } else if (n_alive == 2) {
 | 
						|
        let currently_alive = is_alive(location, 0, 0);
 | 
						|
        alive = bool(currently_alive);
 | 
						|
    } else {
 | 
						|
        alive = false;
 | 
						|
    }
 | 
						|
    let color = vec4<f32>(f32(alive));
 | 
						|
 | 
						|
    storageBarrier();
 | 
						|
 | 
						|
    textureStore(texture, location, color);
 | 
						|
} |