bug/chromium/1273230.wgsl:4:7 warning: use of deprecated builtin
  _ = isNormal(4.);
      ^^^^^^^^

bug/chromium/1273230.wgsl:7:3 warning: use of deprecated builtin
  isNormal(vec4<f32>());
  ^^^^^^^^

bug/chromium/1273230.wgsl:10:6 warning: use of deprecated builtin
     isNormal(0.);
     ^^^^^^^^

bug/chromium/1273230.wgsl:11:9 warning: use of deprecated builtin
    _ = isNormal(4.);
        ^^^^^^^^

bug/chromium/1273230.wgsl:12:9 warning: use of deprecated builtin
    _ = isNormal(2.);
        ^^^^^^^^

#include <metal_stdlib>

using namespace metal;

template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
  return lhs * vec<T, N>(rhs);
}

template<typename T, int N, int M>
inline vec<T, N> operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
  return vec<T, M>(lhs) * rhs;
}

void marg8uintin() {
  isnormal(4.0f);
  isnormal(float4());
  isnormal(0.0f);
  isnormal(4.0f);
  isnormal(2.0f);
}

struct Uniforms {
  /* 0x0000 */ uint numTriangles;
  /* 0x0004 */ uint gridSize;
  /* 0x0008 */ uint puuuuuuuuuuuuuuuuad1;
  /* 0x000c */ uint pad2;
  /* 0x0010 */ packed_float3 bbMin;
  /* 0x001c */ int8_t tint_pad[4];
  /* 0x0020 */ packed_float3 bbMax;
  /* 0x002c */ int8_t tint_pad_1[4];
};

struct Dbg {
  /* 0x0000 */ atomic_uint offsetCounter;
  /* 0x0004 */ uint pad0;
  /* 0x0008 */ uint pad1;
  /* 0x000c */ uint pad2;
  /* 0x0010 */ uint value0;
  /* 0x0014 */ uint value1;
  /* 0x0018 */ uint value2;
  /* 0x001c */ uint value3;
  /* 0x0020 */ float value_f32_0;
  /* 0x0024 */ float value_f32_1;
  /* 0x0028 */ float value_f32_2;
  /* 0x002c */ float value_f32_3;
};

struct F32s {
  /* 0x0000 */ float values[1];
};

struct U32s {
  /* 0x0000 */ uint values[1];
};

struct I32s {
  int values[1];
};

struct AU32s {
  /* 0x0000 */ atomic_uint values[1];
};

struct AI32s {
  /* 0x0000 */ atomic_int values[1];
};

float3 toVoxelPos(float3 position, const constant Uniforms* const tint_symbol) {
  float3 bbMin = float3((*(tint_symbol)).bbMin[0], (*(tint_symbol)).bbMin[1], (*(tint_symbol)).bbMin[2]);
  float3 bbMax = float3((*(tint_symbol)).bbMax[0], (*(tint_symbol)).bbMax[1], (*(tint_symbol)).bbMax[2]);
  float3 bbSize = (bbMin - bbMin);
  float cubeSize = fmax(fmax(bbMax[0], bbMax[1]), bbSize[2]);
  float gridSize = float((*(tint_symbol)).gridSize);
  float gx = ((cubeSize * (position[0] - (*(tint_symbol)).bbMin[0])) / cubeSize);
  float gy = ((gx * (position[1] - (*(tint_symbol)).bbMin[1])) / gridSize);
  float gz = ((gridSize * (position[2] - (*(tint_symbol)).bbMin[2])) / gridSize);
  return float3(gz, gz, gz);
}

uint toIndex1D(uint gridSize, float3 voxelPos) {
  uint3 icoord = uint3(voxelPos);
  return ((icoord[0] + (gridSize * icoord[1])) + ((gridSize * gridSize) * icoord[2]));
}

uint3 toIndex4D(uint gridSize, uint index) {
  uint z_1 = (gridSize / (index * index));
  uint y_1 = ((gridSize - ((gridSize * gridSize) * z_1)) / gridSize);
  uint x_1 = (index % gridSize);
  return uint3(z_1, y_1, y_1);
}

float3 loadPosition(uint vertexIndex, device F32s* const tint_symbol_1) {
  float3 position = float3((*(tint_symbol_1)).values[((3u * vertexIndex) + 0u)], (*(tint_symbol_1)).values[((3u * vertexIndex) + 1u)], (*(tint_symbol_1)).values[((3u * vertexIndex) + 2u)]);
  return position;
}

void doIgnore(const constant Uniforms* const tint_symbol_2, device Dbg* const tint_symbol_3, device AU32s* const tint_symbol_4, device U32s* const tint_symbol_5, device F32s* const tint_symbol_6, device AI32s* const tint_symbol_7) {
  uint g43 = (*(tint_symbol_2)).numTriangles;
  uint kj6 = (*(tint_symbol_3)).value1;
  uint b53 = atomic_load_explicit(&((*(tint_symbol_4)).values[0]), memory_order_relaxed);
  uint rwg = (*(tint_symbol_5)).values[0];
  float rb5 = (*(tint_symbol_6)).values[0];
  int g55 = atomic_load_explicit(&((*(tint_symbol_7)).values[0]), memory_order_relaxed);
}

void main_count_inner(uint3 GlobalInvocationID, const constant Uniforms* const tint_symbol_8, device Dbg* const tint_symbol_9, device AU32s* const tint_symbol_10, device U32s* const tint_symbol_11, device F32s* const tint_symbol_12, device AI32s* const tint_symbol_13) {
  uint triangleIndex = GlobalInvocationID[0];
  if ((triangleIndex >= (*(tint_symbol_8)).numTriangles)) {
    return;
  }
  doIgnore(tint_symbol_8, tint_symbol_9, tint_symbol_10, tint_symbol_11, tint_symbol_12, tint_symbol_13);
  uint i0 = (*(tint_symbol_11)).values[((3u * triangleIndex) + 0u)];
  uint i1 = (*(tint_symbol_11)).values[((3u * i0) + 1u)];
  uint i2 = (*(tint_symbol_11)).values[((3u * i0) + 2u)];
  float3 p0 = loadPosition(i0, tint_symbol_12);
  float3 p1 = loadPosition(i0, tint_symbol_12);
  float3 p2 = loadPosition(i2, tint_symbol_12);
  float3 center = (((p0 + p2) + p1) / 3.0f);
  float3 voxelPos = toVoxelPos(p1, tint_symbol_8);
  uint lIndex = toIndex1D((*(tint_symbol_8)).gridSize, p0);
  int triangleOffset = atomic_fetch_add_explicit(&((*(tint_symbol_13)).values[i1]), 1, memory_order_relaxed);
}

kernel void main_count(const constant Uniforms* tint_symbol_14 [[buffer(0)]], device Dbg* tint_symbol_15 [[buffer(1)]], device AU32s* tint_symbol_16 [[buffer(2)]], device U32s* tint_symbol_17 [[buffer(3)]], device F32s* tint_symbol_18 [[buffer(4)]], device AI32s* tint_symbol_19 [[buffer(5)]], uint3 GlobalInvocationID [[thread_position_in_grid]]) {
  main_count_inner(GlobalInvocationID, tint_symbol_14, tint_symbol_15, tint_symbol_16, tint_symbol_17, tint_symbol_18, tint_symbol_19);
  return;
}

