bug/tint/948.wgsl:146:33 warning: 'textureSampleBias' must only be called from uniform control flow
        let x_217 : vec4<f32> = textureSampleBias(animationMapTexture, animationMapSampler, vec2<f32>(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0);
                                ^^^^^^^^^^^^^^^^^

bug/tint/948.wgsl:138:9 note: control flow depends on non-uniform value
        if ((x_197 > x_198)) {
        ^^

bug/tint/948.wgsl:137:27 note: reading from module-scope private variable 'mt' may result in a non-uniform value
        let x_198 : f32 = mt;
                          ^^

cbuffer cbuffer_x_20 : register(b9, space2) {
  uint4 x_20[8];
};
Texture2D<float4> frameMapTexture : register(t3, space2);
SamplerState frameMapSampler : register(s2, space2);
static float2 tUV = float2(0.0f, 0.0f);
Texture2D<float4> tileMapsTexture0 : register(t5, space2);
SamplerState tileMapsSampler : register(s4, space2);
Texture2D<float4> tileMapsTexture1 : register(t6, space2);
Texture2D<float4> animationMapTexture : register(t8, space2);
SamplerState animationMapSampler : register(s7, space2);
static float mt = 0.0f;
Texture2D<float4> spriteSheetTexture : register(t1, space2);
SamplerState spriteSheetSampler : register(s0, space2);
static float4 glFragColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float2 tileID_1 = float2(0.0f, 0.0f);
static float2 levelUnits = float2(0.0f, 0.0f);
static float2 stageUnits_1 = float2(0.0f, 0.0f);
static float3 vPosition = float3(0.0f, 0.0f, 0.0f);
static float2 vUV = float2(0.0f, 0.0f);

float4x4 getFrameData_f1_(inout float frameID) {
  float fX = 0.0f;
  const float x_15 = frameID;
  const float x_25 = asfloat(x_20[6].w);
  fX = (x_15 / x_25);
  const float4 x_40 = frameMapTexture.SampleBias(frameMapSampler, float2(fX, 0.0f), 0.0f);
  const float4 x_47 = frameMapTexture.SampleBias(frameMapSampler, float2(fX, 0.25f), 0.0f);
  const float4 x_54 = frameMapTexture.SampleBias(frameMapSampler, float2(fX, 0.5f), 0.0f);
  return float4x4(float4(x_40.x, x_40.y, x_40.z, x_40.w), float4(x_47.x, x_47.y, x_47.z, x_47.w), float4(x_54.x, x_54.y, x_54.z, x_54.w), float4((0.0f).xxxx.x, (0.0f).xxxx.y, (0.0f).xxxx.z, (0.0f).xxxx.w));
}

void main_1() {
  float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float2 tileUV = float2(0.0f, 0.0f);
  float2 tileID = float2(0.0f, 0.0f);
  float2 sheetUnits = float2(0.0f, 0.0f);
  float spriteUnits = 0.0f;
  float2 stageUnits = float2(0.0f, 0.0f);
  int i = 0;
  float frameID_1 = 0.0f;
  float4 animationData = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float f = 0.0f;
  float4x4 frameData = float4x4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float param = 0.0f;
  float2 frameSize = float2(0.0f, 0.0f);
  float2 offset_1 = float2(0.0f, 0.0f);
  float2 ratio = float2(0.0f, 0.0f);
  float4 nc = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float alpha = 0.0f;
  float3 mixed = float3(0.0f, 0.0f, 0.0f);
  color = (0.0f).xxxx;
  tileUV = frac(tUV);
  const float x_91 = tileUV.y;
  tileUV.y = (1.0f - x_91);
  tileID = floor(tUV);
  const float2 x_101 = asfloat(x_20[6].xy);
  sheetUnits = ((1.0f).xx / x_101);
  const float x_106 = asfloat(x_20[6].w);
  spriteUnits = (1.0f / x_106);
  const float2 x_111 = asfloat(x_20[5].zw);
  stageUnits = ((1.0f).xx / x_111);
  i = 0;
  {
    [loop] for(; (i < 2); i = (i + 1)) {
      switch(i) {
        case 1: {
          const float2 x_150 = tileID;
          const float2 x_154 = asfloat(x_20[5].zw);
          const float4 x_156 = tileMapsTexture1.SampleBias(tileMapsSampler, ((x_150 + (0.5f).xx) / x_154), 0.0f);
          frameID_1 = x_156.x;
          break;
        }
        case 0: {
          const float2 x_136 = tileID;
          const float2 x_140 = asfloat(x_20[5].zw);
          const float4 x_142 = tileMapsTexture0.SampleBias(tileMapsSampler, ((x_136 + (0.5f).xx) / x_140), 0.0f);
          frameID_1 = x_142.x;
          break;
        }
        default: {
          break;
        }
      }
      const float x_166 = frameID_1;
      const float x_169 = asfloat(x_20[6].w);
      const float4 x_172 = animationMapTexture.SampleBias(animationMapSampler, float2(((x_166 + 0.5f) / x_169), 0.0f), 0.0f);
      animationData = x_172;
      const float x_174 = animationData.y;
      if ((x_174 > 0.0f)) {
        const float x_181 = asfloat(x_20[0].x);
        const float x_184 = animationData.z;
        mt = ((x_181 * x_184) % 1.0f);
        f = 0.0f;
        {
          [loop] for(; (f < 8.0f); f = (f + 1.0f)) {
            const float x_197 = animationData.y;
            if ((x_197 > mt)) {
              const float x_203 = animationData.x;
              frameID_1 = x_203;
              break;
            }
            const float x_208 = frameID_1;
            const float x_211 = asfloat(x_20[6].w);
            const float4 x_217 = animationMapTexture.SampleBias(animationMapSampler, float2(((x_208 + 0.5f) / x_211), (0.125f * f)), 0.0f);
            animationData = x_217;
          }
        }
      }
      param = (frameID_1 + 0.5f);
      const float4x4 x_225 = getFrameData_f1_(param);
      frameData = x_225;
      const float4 x_228 = frameData[0];
      const float2 x_231 = asfloat(x_20[6].xy);
      frameSize = (float2(x_228.w, x_228.z) / x_231);
      const float4 x_235 = frameData[0];
      offset_1 = (float2(x_235.x, x_235.y) * sheetUnits);
      const float4 x_241 = frameData[2];
      const float4 x_244 = frameData[0];
      ratio = (float2(x_241.x, x_241.y) / float2(x_244.w, x_244.z));
      const float x_248 = frameData[2].z;
      if ((x_248 == 1.0f)) {
        const float2 x_252 = tileUV;
        tileUV = float2(x_252.y, x_252.x);
      }
      if ((i == 0)) {
        const float4 x_268 = spriteSheetTexture.Sample(spriteSheetSampler, ((tileUV * frameSize) + offset_1));
        color = x_268;
      } else {
        const float4 x_279 = spriteSheetTexture.Sample(spriteSheetSampler, ((tileUV * frameSize) + offset_1));
        nc = x_279;
        const float x_283 = color.w;
        const float x_285 = nc.w;
        alpha = min((x_283 + x_285), 1.0f);
        const float4 x_290 = color;
        const float4 x_292 = nc;
        const float x_295 = nc.w;
        mixed = lerp(float3(x_290.x, x_290.y, x_290.z), float3(x_292.x, x_292.y, x_292.z), float3(x_295, x_295, x_295));
        const float3 x_298 = mixed;
        color = float4(x_298.x, x_298.y, x_298.z, alpha);
      }
    }
  }
  const float3 x_310 = asfloat(x_20[7].xyz);
  const float4 x_311 = color;
  const float3 x_313 = (float3(x_311.x, x_311.y, x_311.z) * x_310);
  color = float4(x_313.x, x_313.y, x_313.z, color.w);
  glFragColor = color;
  return;
}

struct main_out {
  float4 glFragColor_1;
};
struct tint_symbol_1 {
  float3 vPosition_param : TEXCOORD0;
  float2 vUV_param : TEXCOORD1;
  float2 tUV_param : TEXCOORD2;
  float2 stageUnits_1_param : TEXCOORD3;
  float2 levelUnits_param : TEXCOORD4;
  float2 tileID_1_param : TEXCOORD5;
};
struct tint_symbol_2 {
  float4 glFragColor_1 : SV_Target0;
};

main_out main_inner(float2 tUV_param, float2 tileID_1_param, float2 levelUnits_param, float2 stageUnits_1_param, float3 vPosition_param, float2 vUV_param) {
  tUV = tUV_param;
  tileID_1 = tileID_1_param;
  levelUnits = levelUnits_param;
  stageUnits_1 = stageUnits_1_param;
  vPosition = vPosition_param;
  vUV = vUV_param;
  main_1();
  const main_out tint_symbol_6 = {glFragColor};
  return tint_symbol_6;
}

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const main_out inner_result = main_inner(tint_symbol.tUV_param, tint_symbol.tileID_1_param, tint_symbol.levelUnits_param, tint_symbol.stageUnits_1_param, tint_symbol.vPosition_param, tint_symbol.vUV_param);
  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
  wrapper_result.glFragColor_1 = inner_result.glFragColor_1;
  return wrapper_result;
}
