bug/tint/949.wgsl:326:29 warning: 'textureSample' must only be called from uniform control flow
    let x_397 : vec4<f32> = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395));
                            ^^^^^^^^^^^^^

bug/tint/949.wgsl:330:5 note: control flow depends on non-uniform value
    if ((x_400 > x_401)) {
    ^^

bug/tint/949.wgsl:308:27 note: reading from module-scope private variable 'v_output2' may result in a non-uniform value
  let x_366 : vec4<f32> = v_output2;
                          ^^^^^^^^^

struct lightingInfo {
  float3 diffuse;
  float3 specular;
};

static float u_Float = 0.0f;
static float3 u_Color = float3(0.0f, 0.0f, 0.0f);
Texture2D<float4> TextureSamplerTexture : register(t1, space2);
SamplerState TextureSamplerSampler : register(s0, space2);
static float2 vMainuv = float2(0.0f, 0.0f);
cbuffer cbuffer_x_269 : register(b6, space2) {
  uint4 x_269[11];
};
static float4 v_output1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
static bool gl_FrontFacing = false;
static float2 v_uv = float2(0.0f, 0.0f);
static float4 v_output2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
Texture2D<float4> TextureSampler1Texture : register(t3, space2);
SamplerState TextureSampler1Sampler : register(s2, space2);
cbuffer cbuffer_light0 : register(b5, space0) {
  uint4 light0[6];
};
static float4 glFragColor = float4(0.0f, 0.0f, 0.0f, 0.0f);
SamplerState bumpSamplerSampler : register(s4, space2);
Texture2D<float4> bumpSamplerTexture : register(t5, space2);

float3x3 cotangent_frame_vf3_vf3_vf2_vf2_(inout float3 normal_1, inout float3 p, inout float2 uv, inout float2 tangentSpaceParams) {
  float3 dp1 = float3(0.0f, 0.0f, 0.0f);
  float3 dp2 = float3(0.0f, 0.0f, 0.0f);
  float2 duv1 = float2(0.0f, 0.0f);
  float2 duv2 = float2(0.0f, 0.0f);
  float3 dp2perp = float3(0.0f, 0.0f, 0.0f);
  float3 dp1perp = float3(0.0f, 0.0f, 0.0f);
  float3 tangent = float3(0.0f, 0.0f, 0.0f);
  float3 bitangent = float3(0.0f, 0.0f, 0.0f);
  float invmax = 0.0f;
  const float3 x_133 = p;
  dp1 = ddx(x_133);
  const float3 x_136 = p;
  dp2 = ddy(x_136);
  const float2 x_139 = uv;
  duv1 = ddx(x_139);
  const float2 x_142 = uv;
  duv2 = ddy(x_142);
  const float3 x_145 = dp2;
  const float3 x_146 = normal_1;
  dp2perp = cross(x_145, x_146);
  const float3 x_149 = normal_1;
  dp1perp = cross(x_149, dp1);
  const float3 x_153 = dp2perp;
  const float x_155 = duv1.x;
  const float3 x_157 = dp1perp;
  const float x_159 = duv2.x;
  tangent = ((x_153 * x_155) + (x_157 * x_159));
  const float3 x_163 = dp2perp;
  const float x_165 = duv1.y;
  const float3 x_167 = dp1perp;
  const float x_169 = duv2.y;
  bitangent = ((x_163 * x_165) + (x_167 * x_169));
  const float x_173 = tangentSpaceParams.x;
  tangent = (tangent * x_173);
  const float x_177 = tangentSpaceParams.y;
  bitangent = (bitangent * x_177);
  invmax = rsqrt(max(dot(tangent, tangent), dot(bitangent, bitangent)));
  const float3 x_191 = (tangent * invmax);
  const float3 x_194 = (bitangent * invmax);
  const float3 x_195 = normal_1;
  return float3x3(float3(x_191.x, x_191.y, x_191.z), float3(x_194.x, x_194.y, x_194.z), float3(x_195.x, x_195.y, x_195.z));
}

float3x3 transposeMat3_mf33_(inout float3x3 inMatrix) {
  float3 i0 = float3(0.0f, 0.0f, 0.0f);
  float3 i1 = float3(0.0f, 0.0f, 0.0f);
  float3 i2 = float3(0.0f, 0.0f, 0.0f);
  float3x3 outMatrix = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  const float3 x_60 = inMatrix[0];
  i0 = x_60;
  const float3 x_64 = inMatrix[1];
  i1 = x_64;
  const float3 x_68 = inMatrix[2];
  i2 = x_68;
  const float x_73 = i0.x;
  const float x_75 = i1.x;
  const float x_77 = i2.x;
  const float3 x_78 = float3(x_73, x_75, x_77);
  const float x_81 = i0.y;
  const float x_83 = i1.y;
  const float x_85 = i2.y;
  const float3 x_86 = float3(x_81, x_83, x_85);
  const float x_89 = i0.z;
  const float x_91 = i1.z;
  const float x_93 = i2.z;
  const float3 x_94 = float3(x_89, x_91, x_93);
  outMatrix = float3x3(float3(x_78.x, x_78.y, x_78.z), float3(x_86.x, x_86.y, x_86.z), float3(x_94.x, x_94.y, x_94.z));
  return outMatrix;
}

float3 perturbNormalBase_mf33_vf3_f1_(inout float3x3 cotangentFrame, inout float3 normal, inout float scale) {
  const float3x3 x_113 = cotangentFrame;
  const float3 x_114 = normal;
  return normalize(mul(x_114, x_113));
}

float3 perturbNormal_mf33_vf3_f1_(inout float3x3 cotangentFrame_1, inout float3 textureSample, inout float scale_1) {
  float3x3 param = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float3 param_1 = float3(0.0f, 0.0f, 0.0f);
  float param_2 = 0.0f;
  const float3 x_119 = textureSample;
  const float3x3 x_125 = cotangentFrame_1;
  param = x_125;
  param_1 = ((x_119 * 2.0f) - (1.0f).xxx);
  const float x_128 = scale_1;
  param_2 = x_128;
  const float3 x_129 = perturbNormalBase_mf33_vf3_f1_(param, param_1, param_2);
  return x_129;
}

lightingInfo computeHemisphericLighting_vf3_vf3_vf4_vf3_vf3_vf3_f1_(inout float3 viewDirectionW, inout float3 vNormal, inout float4 lightData, inout float3 diffuseColor, inout float3 specularColor, inout float3 groundColor, inout float glossiness) {
  float ndl = 0.0f;
  lightingInfo result = (lightingInfo)0;
  float3 angleW = float3(0.0f, 0.0f, 0.0f);
  float specComp = 0.0f;
  const float3 x_212 = vNormal;
  const float4 x_213 = lightData;
  ndl = ((dot(x_212, float3(x_213.x, x_213.y, x_213.z)) * 0.5f) + 0.5f);
  const float3 x_220 = groundColor;
  const float3 x_221 = diffuseColor;
  const float x_222 = ndl;
  result.diffuse = lerp(x_220, x_221, float3(x_222, x_222, x_222));
  const float3 x_227 = viewDirectionW;
  const float4 x_228 = lightData;
  angleW = normalize((x_227 + float3(x_228.x, x_228.y, x_228.z)));
  const float3 x_233 = vNormal;
  specComp = max(0.0f, dot(x_233, angleW));
  const float x_237 = specComp;
  const float x_238 = glossiness;
  specComp = pow(x_237, max(1.0f, x_238));
  const float x_241 = specComp;
  const float3 x_242 = specularColor;
  result.specular = (x_242 * x_241);
  return result;
}

void main_1() {
  float4 tempTextureRead = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float3 rgb = float3(0.0f, 0.0f, 0.0f);
  float3 output5 = float3(0.0f, 0.0f, 0.0f);
  float4 output4 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float2 uvOffset = float2(0.0f, 0.0f);
  float normalScale = 0.0f;
  float2 TBNUV = float2(0.0f, 0.0f);
  float2 x_299 = float2(0.0f, 0.0f);
  float3x3 TBN = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float3 param_3 = float3(0.0f, 0.0f, 0.0f);
  float3 param_4 = float3(0.0f, 0.0f, 0.0f);
  float2 param_5 = float2(0.0f, 0.0f);
  float2 param_6 = float2(0.0f, 0.0f);
  float3x3 invTBN = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float3x3 param_7 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float parallaxLimit = 0.0f;
  float2 vOffsetDir = float2(0.0f, 0.0f);
  float2 vMaxOffset = float2(0.0f, 0.0f);
  float numSamples = 0.0f;
  float stepSize = 0.0f;
  float currRayHeight = 0.0f;
  float2 vCurrOffset = float2(0.0f, 0.0f);
  float2 vLastOffset = float2(0.0f, 0.0f);
  float lastSampledHeight = 0.0f;
  float currSampledHeight = 0.0f;
  int i = 0;
  float delta1 = 0.0f;
  float delta2 = 0.0f;
  float ratio = 0.0f;
  float2 parallaxOcclusion_0 = float2(0.0f, 0.0f);
  float3x3 param_8 = float3x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float3 param_9 = float3(0.0f, 0.0f, 0.0f);
  float param_10 = 0.0f;
  float2 output6 = float2(0.0f, 0.0f);
  float4 tempTextureRead1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float3 rgb1 = float3(0.0f, 0.0f, 0.0f);
  float3 viewDirectionW_1 = float3(0.0f, 0.0f, 0.0f);
  float shadow = 0.0f;
  float glossiness_1 = 0.0f;
  float3 diffuseBase = float3(0.0f, 0.0f, 0.0f);
  float3 specularBase = float3(0.0f, 0.0f, 0.0f);
  float3 normalW = float3(0.0f, 0.0f, 0.0f);
  lightingInfo info = (lightingInfo)0;
  float3 param_11 = float3(0.0f, 0.0f, 0.0f);
  float3 param_12 = float3(0.0f, 0.0f, 0.0f);
  float4 param_13 = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float3 param_14 = float3(0.0f, 0.0f, 0.0f);
  float3 param_15 = float3(0.0f, 0.0f, 0.0f);
  float3 param_16 = float3(0.0f, 0.0f, 0.0f);
  float param_17 = 0.0f;
  float3 diffuseOutput = float3(0.0f, 0.0f, 0.0f);
  float3 specularOutput = float3(0.0f, 0.0f, 0.0f);
  float3 output3 = float3(0.0f, 0.0f, 0.0f);
  u_Float = 100.0f;
  u_Color = (0.5f).xxx;
  const float4 x_262 = TextureSamplerTexture.Sample(TextureSamplerSampler, vMainuv);
  tempTextureRead = x_262;
  const float4 x_264 = tempTextureRead;
  const float x_273 = asfloat(x_269[10].x);
  rgb = (float3(x_264.x, x_264.y, x_264.z) * x_273);
  const float3 x_279 = asfloat(x_269[9].xyz);
  const float4 x_282 = v_output1;
  output5 = normalize((x_279 - float3(x_282.x, x_282.y, x_282.z)));
  output4 = (0.0f).xxxx;
  uvOffset = (0.0f).xx;
  const float x_292 = asfloat(x_269[8].x);
  normalScale = (1.0f / x_292);
  if (gl_FrontFacing) {
    x_299 = v_uv;
  } else {
    x_299 = -(v_uv);
  }
  TBNUV = x_299;
  const float4 x_310 = v_output2;
  param_3 = (float3(x_310.x, x_310.y, x_310.z) * normalScale);
  const float4 x_317 = v_output1;
  param_4 = float3(x_317.x, x_317.y, x_317.z);
  param_5 = TBNUV;
  const float2 x_324 = asfloat(x_269[10].zw);
  param_6 = x_324;
  const float3x3 x_325 = cotangent_frame_vf3_vf3_vf2_vf2_(param_3, param_4, param_5, param_6);
  TBN = x_325;
  param_7 = TBN;
  const float3x3 x_329 = transposeMat3_mf33_(param_7);
  invTBN = x_329;
  const float3 x_334 = mul(-(output5), invTBN);
  parallaxLimit = (length(float2(x_334.x, x_334.y)) / mul(-(output5), invTBN).z);
  const float x_345 = asfloat(x_269[9].w);
  parallaxLimit = (parallaxLimit * x_345);
  const float3 x_352 = mul(-(output5), invTBN);
  vOffsetDir = normalize(float2(x_352.x, x_352.y));
  vMaxOffset = (vOffsetDir * parallaxLimit);
  const float4 x_366 = v_output2;
  numSamples = (15.0f + (dot(mul(-(output5), invTBN), mul(float3(x_366.x, x_366.y, x_366.z), invTBN)) * -11.0f));
  stepSize = (1.0f / numSamples);
  currRayHeight = 1.0f;
  vCurrOffset = (0.0f).xx;
  vLastOffset = (0.0f).xx;
  lastSampledHeight = 1.0f;
  currSampledHeight = 1.0f;
  i = 0;
  {
    [loop] for(; (i < 15); i = (i + 1)) {
      const float4 x_397 = TextureSamplerTexture.Sample(TextureSamplerSampler, (v_uv + vCurrOffset));
      currSampledHeight = x_397.w;
      if ((currSampledHeight > currRayHeight)) {
        delta1 = (currSampledHeight - currRayHeight);
        delta2 = ((currRayHeight + stepSize) - lastSampledHeight);
        ratio = (delta1 / (delta1 + delta2));
        vCurrOffset = ((vLastOffset * ratio) + (vCurrOffset * (1.0f - ratio)));
        break;
      } else {
        currRayHeight = (currRayHeight - stepSize);
        vLastOffset = vCurrOffset;
        vCurrOffset = (vCurrOffset + (vMaxOffset * stepSize));
        lastSampledHeight = currSampledHeight;
      }
    }
  }
  parallaxOcclusion_0 = vCurrOffset;
  uvOffset = parallaxOcclusion_0;
  const float4 x_452 = TextureSamplerTexture.Sample(TextureSamplerSampler, (v_uv + uvOffset));
  const float x_454 = asfloat(x_269[8].x);
  param_8 = TBN;
  param_9 = float3(x_452.x, x_452.y, x_452.z);
  param_10 = (1.0f / x_454);
  const float3 x_461 = perturbNormal_mf33_vf3_f1_(param_8, param_9, param_10);
  output4 = float4(x_461.x, x_461.y, x_461.z, output4.w);
  output6 = (v_uv + uvOffset);
  const float4 x_475 = TextureSampler1Texture.Sample(TextureSampler1Sampler, output6);
  tempTextureRead1 = x_475;
  const float4 x_477 = tempTextureRead1;
  rgb1 = float3(x_477.x, x_477.y, x_477.z);
  const float3 x_481 = asfloat(x_269[9].xyz);
  const float4 x_482 = v_output1;
  viewDirectionW_1 = normalize((x_481 - float3(x_482.x, x_482.y, x_482.z)));
  shadow = 1.0f;
  glossiness_1 = (1.0f * u_Float);
  diffuseBase = (0.0f).xxx;
  specularBase = (0.0f).xxx;
  const float4 x_494 = output4;
  normalW = float3(x_494.x, x_494.y, x_494.z);
  param_11 = viewDirectionW_1;
  param_12 = normalW;
  const float4 x_507 = asfloat(light0[0]);
  param_13 = x_507;
  const float4 x_510 = asfloat(light0[1]);
  param_14 = float3(x_510.x, x_510.y, x_510.z);
  const float4 x_514 = asfloat(light0[2]);
  param_15 = float3(x_514.x, x_514.y, x_514.z);
  const float3 x_518 = asfloat(light0[3].xyz);
  param_16 = x_518;
  param_17 = glossiness_1;
  const lightingInfo x_521 = computeHemisphericLighting_vf3_vf3_vf4_vf3_vf3_vf3_f1_(param_11, param_12, param_13, param_14, param_15, param_16, param_17);
  info = x_521;
  shadow = 1.0f;
  const float3 x_523 = info.diffuse;
  diffuseBase = (diffuseBase + (x_523 * shadow));
  const float3 x_529 = info.specular;
  specularBase = (specularBase + (x_529 * shadow));
  diffuseOutput = (diffuseBase * rgb1);
  specularOutput = (specularBase * u_Color);
  output3 = (diffuseOutput + specularOutput);
  const float3 x_548 = output3;
  glFragColor = float4(x_548.x, x_548.y, x_548.z, 1.0f);
  return;
}

struct main_out {
  float4 glFragColor_1;
};
struct tint_symbol_1 {
  float4 v_output1_param : TEXCOORD0;
  float2 vMainuv_param : TEXCOORD1;
  float4 v_output2_param : TEXCOORD2;
  float2 v_uv_param : TEXCOORD3;
  bool gl_FrontFacing_param : SV_IsFrontFace;
};
struct tint_symbol_2 {
  float4 glFragColor_1 : SV_Target0;
};

main_out main_inner(float2 vMainuv_param, float4 v_output1_param, bool gl_FrontFacing_param, float2 v_uv_param, float4 v_output2_param) {
  vMainuv = vMainuv_param;
  v_output1 = v_output1_param;
  gl_FrontFacing = gl_FrontFacing_param;
  v_uv = v_uv_param;
  v_output2 = v_output2_param;
  main_1();
  const main_out tint_symbol_8 = {glFragColor};
  return tint_symbol_8;
}

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const main_out inner_result = main_inner(tint_symbol.vMainuv_param, tint_symbol.v_output1_param, tint_symbol.gl_FrontFacing_param, tint_symbol.v_uv_param, tint_symbol.v_output2_param);
  tint_symbol_2 wrapper_result = (tint_symbol_2)0;
  wrapper_result.glFragColor_1 = inner_result.glFragColor_1;
  return wrapper_result;
}
