mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-16 12:21:35 +00:00
The expected output is far from perfect, and the generated HLSL and MSL isn't even validated yet, so may be incorrect. However, by committing the generated output, we get clear examples of the currently generated output of each backend. As we land fixes and improvements to each backend, the presubmits will require us to update the expected test output, and so code reviews will include diffs of each backend's generated output. Change-Id: I5c2a9e5b796d0ab75b3ec4c7f8ad00a0a2ab166f Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51224 Commit-Queue: Ben Clayton <bclayton@chromium.org> Reviewed-by: David Neto <dneto@google.com>
107 lines
2.9 KiB
WebGPU Shading Language
107 lines
2.9 KiB
WebGPU Shading Language
[[stage(vertex)]]
|
|
fn vert_main([[location(0)]] a_particlePos : vec2<f32>, [[location(1)]] a_particleVel : vec2<f32>, [[location(2)]] a_pos : vec2<f32>) -> [[builtin(position)]] vec4<f32> {
|
|
var angle : f32 = -(atan2(a_particleVel.x, a_particleVel.y));
|
|
var pos : vec2<f32> = vec2<f32>(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
|
|
return vec4<f32>((pos + a_particlePos), 0.0, 1.0);
|
|
}
|
|
|
|
[[stage(fragment)]]
|
|
fn frag_main() -> [[location(0)]] vec4<f32> {
|
|
return vec4<f32>(1.0, 1.0, 1.0, 1.0);
|
|
}
|
|
|
|
struct Particle {
|
|
pos : vec2<f32>;
|
|
vel : vec2<f32>;
|
|
};
|
|
|
|
[[block]]
|
|
struct SimParams {
|
|
deltaT : f32;
|
|
rule1Distance : f32;
|
|
rule2Distance : f32;
|
|
rule3Distance : f32;
|
|
rule1Scale : f32;
|
|
rule2Scale : f32;
|
|
rule3Scale : f32;
|
|
};
|
|
|
|
[[block]]
|
|
struct Particles {
|
|
particles : array<Particle, 5>;
|
|
};
|
|
|
|
[[binding(0), group(0)]] var<uniform> params : SimParams;
|
|
|
|
[[binding(1), group(0)]] var<storage> particlesA : [[access(read_write)]] Particles;
|
|
|
|
[[binding(2), group(0)]] var<storage> particlesB : [[access(read_write)]] Particles;
|
|
|
|
[[stage(compute)]]
|
|
fn comp_main([[builtin(global_invocation_id)]] gl_GlobalInvocationID : vec3<u32>) {
|
|
var index : u32 = gl_GlobalInvocationID.x;
|
|
if ((index >= 5u)) {
|
|
return;
|
|
}
|
|
var vPos : vec2<f32> = particlesA.particles[index].pos;
|
|
var vVel : vec2<f32> = particlesA.particles[index].vel;
|
|
var cMass : vec2<f32> = vec2<f32>(0.0, 0.0);
|
|
var cVel : vec2<f32> = vec2<f32>(0.0, 0.0);
|
|
var colVel : vec2<f32> = vec2<f32>(0.0, 0.0);
|
|
var cMassCount : i32 = 0;
|
|
var cVelCount : i32 = 0;
|
|
var pos : vec2<f32>;
|
|
var vel : vec2<f32>;
|
|
{
|
|
var i : u32 = 0u;
|
|
loop {
|
|
if (!((i < 5u))) {
|
|
break;
|
|
}
|
|
if ((i == index)) {
|
|
continue;
|
|
}
|
|
pos = particlesA.particles[i].pos.xy;
|
|
vel = particlesA.particles[i].vel.xy;
|
|
if ((distance(pos, vPos) < params.rule1Distance)) {
|
|
cMass = (cMass + pos);
|
|
cMassCount = (cMassCount + 1);
|
|
}
|
|
if ((distance(pos, vPos) < params.rule2Distance)) {
|
|
colVel = (colVel - (pos - vPos));
|
|
}
|
|
if ((distance(pos, vPos) < params.rule3Distance)) {
|
|
cVel = (cVel + vel);
|
|
cVelCount = (cVelCount + 1);
|
|
}
|
|
|
|
continuing {
|
|
i = (i + 1u);
|
|
}
|
|
}
|
|
}
|
|
if ((cMassCount > 0)) {
|
|
cMass = ((cMass / vec2<f32>(f32(cMassCount), f32(cMassCount))) - vPos);
|
|
}
|
|
if ((cVelCount > 0)) {
|
|
cVel = (cVel / vec2<f32>(f32(cVelCount), f32(cVelCount)));
|
|
}
|
|
vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
|
|
vVel = (normalize(vVel) * clamp(length(vVel), 0.0, 0.100000001));
|
|
vPos = (vPos + (vVel * params.deltaT));
|
|
if ((vPos.x < -1.0)) {
|
|
vPos.x = 1.0;
|
|
}
|
|
if ((vPos.x > 1.0)) {
|
|
vPos.x = -1.0;
|
|
}
|
|
if ((vPos.y < -1.0)) {
|
|
vPos.y = 1.0;
|
|
}
|
|
if ((vPos.y > 1.0)) {
|
|
vPos.y = -1.0;
|
|
}
|
|
particlesB.particles[index].pos = vPos;
|
|
particlesB.particles[index].vel = vVel;
|
|
}
|