mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-04 19:25:47 +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>
121 lines
3.5 KiB
Plaintext
121 lines
3.5 KiB
Plaintext
#include <metal_stdlib>
|
|
|
|
using namespace metal;
|
|
struct tint_symbol_1 {
|
|
float2 a_particlePos [[attribute(0)]];
|
|
float2 a_particleVel [[attribute(1)]];
|
|
float2 a_pos [[attribute(2)]];
|
|
};
|
|
struct tint_symbol_2 {
|
|
float4 value [[position]];
|
|
};
|
|
struct tint_symbol_3 {
|
|
float4 value [[color(0)]];
|
|
};
|
|
struct Particle {
|
|
/* 0x0000 */ packed_float2 pos;
|
|
/* 0x0008 */ packed_float2 vel;
|
|
};
|
|
struct SimParams {
|
|
/* 0x0000 */ float deltaT;
|
|
/* 0x0004 */ float rule1Distance;
|
|
/* 0x0008 */ float rule2Distance;
|
|
/* 0x000c */ float rule3Distance;
|
|
/* 0x0010 */ float rule1Scale;
|
|
/* 0x0014 */ float rule2Scale;
|
|
/* 0x0018 */ float rule3Scale;
|
|
};
|
|
struct Particles {
|
|
/* 0x0000 */ Particle particles[5];
|
|
};
|
|
struct tint_symbol_5 {
|
|
uint3 gl_GlobalInvocationID [[thread_position_in_grid]];
|
|
};
|
|
|
|
vertex tint_symbol_2 vert_main(tint_symbol_1 tint_symbol [[stage_in]]) {
|
|
const float2 a_particlePos = tint_symbol.a_particlePos;
|
|
const float2 a_particleVel = tint_symbol.a_particleVel;
|
|
const float2 a_pos = tint_symbol.a_pos;
|
|
float angle = -( atan2(a_particleVel.x, a_particleVel.y));
|
|
float2 pos = float2(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
|
|
return {float4((pos + a_particlePos), 0.0f, 1.0f)};
|
|
}
|
|
|
|
fragment tint_symbol_3 frag_main() {
|
|
return {float4(1.0f, 1.0f, 1.0f, 1.0f)};
|
|
}
|
|
|
|
kernel void comp_main(tint_symbol_5 tint_symbol_4 [[stage_in]], constant SimParams& params [[buffer(0)]], device Particles& particlesA [[buffer(1)]], device Particles& particlesB [[buffer(2)]]) {
|
|
const uint3 gl_GlobalInvocationID = tint_symbol_4.gl_GlobalInvocationID;
|
|
uint index = gl_GlobalInvocationID.x;
|
|
if ((index >= 5u)) {
|
|
return;
|
|
}
|
|
float2 vPos = particlesA.particles[index].pos;
|
|
float2 vVel = particlesA.particles[index].vel;
|
|
float2 cMass = float2(0.0f, 0.0f);
|
|
float2 cVel = float2(0.0f, 0.0f);
|
|
float2 colVel = float2(0.0f, 0.0f);
|
|
int cMassCount = 0;
|
|
int cVelCount = 0;
|
|
float2 pos = 0.0f;
|
|
float2 vel = 0.0f;
|
|
{
|
|
uint i = 0u;
|
|
{
|
|
bool tint_msl_is_first_1 = true;
|
|
for(;;) {
|
|
if (!tint_msl_is_first_1) {
|
|
i = (i + 1u);
|
|
}
|
|
tint_msl_is_first_1 = false;
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ((cMassCount > 0)) {
|
|
cMass = ((cMass / float2(float(cMassCount), float(cMassCount))) - vPos);
|
|
}
|
|
if ((cVelCount > 0)) {
|
|
cVel = (cVel / float2(float(cVelCount), float(cVelCount)));
|
|
}
|
|
vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
|
|
vVel = ( normalize(vVel) * clamp( length(vVel), 0.0f, 0.100000001f));
|
|
vPos = (vPos + (vVel * params.deltaT));
|
|
if ((vPos.x < -1.0f)) {
|
|
vPos.x = 1.0f;
|
|
}
|
|
if ((vPos.x > 1.0f)) {
|
|
vPos.x = -1.0f;
|
|
}
|
|
if ((vPos.y < -1.0f)) {
|
|
vPos.y = 1.0f;
|
|
}
|
|
if ((vPos.y > 1.0f)) {
|
|
vPos.y = -1.0f;
|
|
}
|
|
particlesB.particles[index].pos = vPos;
|
|
particlesB.particles[index].vel = vVel;
|
|
return;
|
|
}
|
|
|