// AO blend & reprojection - DarkStarSword

cbuffer PER_BATCH : register(b0)
{
  float4 PS_WorldViewPos : packoffset(c0);
  float4 SvoParamsMisc3 : packoffset(c1);
  float4 PS_NearFarClipDist : packoffset(c2);
  float4 SVO_AnalyticalOccluders[256] : packoffset(c3);
  row_major float3x4 SVO_ReprojectionMatrix : packoffset(c259);
  float4 PS_ScreenSize : packoffset(c262);
  float4 SVO_TargetResScale : packoffset(c263);
}

SamplerState sceneRgbSamplerMinPrev_s : register(s0);
SamplerState sceneAldSamplerMinPrev_s : register(s1);
SamplerState sceneRgbSamplerMaxPrev_s : register(s2);
SamplerState sceneAldSamplerMaxPrev_s : register(s3);
SamplerState sceneDepthMapSampler_s : register(s4);
SamplerState SVO_VelocityRT_s : register(s8);
SamplerState sceneAldSampler_s : register(s10);
SamplerState sceneRgbSampler_s : register(s11);
SamplerState sceneGBuffer0_s : register(s14);
Texture2D<float4> sceneRgbSamplerMinPrev : register(t0);
Texture2D<float4> sceneAldSamplerMinPrev : register(t1);
Texture2D<float4> sceneRgbSamplerMaxPrev : register(t2);
Texture2D<float4> sceneAldSamplerMaxPrev : register(t3);
Texture2D<float4> sceneDepthMapSampler : register(t4);
Texture2D<float4> SVO_VelocityRT : register(t8);
Texture2D<float4> sceneAldSampler : register(t10);
Texture2D<float4> sceneRgbSampler : register(t11);
Texture2D<float4> sceneGBuffer0 : register(t14);


// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main(
  float4 v0 : SV_Position0,
  float4 v1 : TEXCOORD0,
  float4 v2 : TEXCOORD1,
  out float4 o0 : SV_Target0,
  out float4 o1 : SV_Target1,
  out float4 o2 : SV_Target2,
  out float4 o3 : SV_Target3)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14;
  uint4 bitmask, uiDest;
  float4 fDest;

float4 stereo = StereoParams.Load(0);

  r0.x = sceneDepthMapSampler.Sample(sceneDepthMapSampler_s, v1.xy).x;

// May need to correct v2, but makes no noticeable difference:
  r0.yzw = v2.xyz * r0.xxx;

  r1.xy = float2(0.5,0.5) / PS_ScreenSize.xy;
  r1.zw = r0.xx;
  r2.xyzw = float4(0,0,0,0);
  while (true) {
    r3.x = cmp(1 < (int)r2.w);
    if (r3.x != 0) break;
    r3.x = (int)r2.w;
    r4.xyz = r2.xyz;
    r3.zw = r1.zw;
    r4.w = 0;
    while (true) {
      r5.x = cmp(1 < (int)r4.w);
      if (r5.x != 0) break;
      r3.y = (int)r4.w;
      r5.xy = r1.xy * r3.xy + v1.xy;
      r3.y = sceneDepthMapSampler.Sample(sceneDepthMapSampler_s, r5.xy).x;
      r3.z = min(r3.z, r3.y);
      r3.w = max(r3.w, r3.y);
      r3.y = r0.x / r3.y;
      r3.y = 1 + -r3.y;
      r3.y = 0.119999997 + -abs(r3.y);
      r3.y = max(0, r3.y);
      r3.y = 0.00100000005 + r3.y;
      r5.xyz = sceneGBuffer0.Sample(sceneGBuffer0_s, r5.xy).xyz;
      r5.xyz = r5.xyz * float3(2,2,2) + float3(-1,-1,-1);
      r5.w = dot(r5.xyz, r5.xyz);
      r5.w = rsqrt(r5.w);
      r5.xyz = r5.xyz * r5.www;
      r4.xyz = r5.xyz * r3.yyy + r4.xyz;
      r4.w = (int)r4.w + 1;
    }
    r2.xyz = r4.xyz;
    r1.zw = r3.zw;
    r2.w = (int)r2.w + 1;
  }
  r0.x = dot(r2.xyz, r2.xyz);
  r0.x = rsqrt(r0.x);
  r2.xyz = r2.xyz * r0.xxx;
  r0.x = dot(r0.yzw, r0.yzw);
  r0.x = sqrt(r0.x);
  r0.yz = trunc(PS_ScreenSize.xy);
  r0.yz = float2(2,2) / r0.yz;
  r0.w = dot(v2.xyz, v2.xyz);
  r0.w = rsqrt(r0.w);
  r3.xyz = v2.xyz * r0.www;
  r0.w = dot(r3.xyz, -r2.xyz);
  r0.w = saturate(1 + -r0.w);
  r0.w = r0.w * 0.0799999982 + 0.119999997;
  r3.xyzw = float4(0.5,0.5,8,8) * r0.yzyz;
  r1.xy = v1.xy / r3.xy;
  r1.xy = trunc(r1.xy);
  r1.xy = r1.xy * r3.xy + r3.xy;
  r3.xy = -r0.yz * float2(8,8) + float2(1,1);
  r1.xy = max(r1.xy, r3.zw);
  r1.xy = min(r1.xy, r3.xy);
  r0.x = -r0.x * 0.0625 + 1;
  r0.x = max(0, r0.x);
  r0.x = r0.x * 0.5 + 1.20000005;
  r3.xyzw = float4(0,0,0,0);
  r4.xyzw = float4(0,0,0,0);
  r2.w = 0;
  r5.xyzw = float4(0,0,0,0);
  r6.xyzw = float4(0,0,0,-1);
  while (true) {
    r7.x = cmp(8 < (int)r6.w);
    if (r7.x != 0) break;
    r7.x = (int)r6.w;
    r8.xyzw = r3.xyzw;
    r9.xyzw = r4.xyzw;
    r10.xyz = r5.xyz;
    r11.xyz = r6.xyz;
    r7.z = r2.w;
    r7.w = r5.w;
    r10.w = -8;
    while (true) {
      r11.w = cmp(8 < (int)r10.w);
      if (r11.w != 0) break;
      r7.y = (int)r10.w;
      r12.xy = saturate(r0.yz * r7.xy + r1.xy);
      r13.xyzw = sceneAldSampler.SampleLevel(sceneAldSampler_s, r12.xy, 0).xyzw;
      r12.xyzw = sceneRgbSampler.SampleLevel(sceneRgbSampler_s, r12.xy, 0).xyzw;
      r7.y = (int)r10.w * (int)r10.w;
      r7.y = mad((int)r6.w, (int)r6.w, (int)r7.y);
      r7.y = (int)r7.y;
      r7.y = sqrt(r7.y);
      r7.y = saturate(-r7.y * 0.125 + r0.x);
      r11.w = dot(r13.xyz, r13.xyz);
      r14.x = rsqrt(r11.w);
      r14.xyz = r14.xxx * r13.xyz;
      r14.x = dot(r14.xyz, r2.xyz);
      r14.x = saturate(-0.25 + r14.x);
      r11.w = sqrt(r11.w);
      r14.y = max(9.99999975e-005, r13.w);
      r11.w = r11.w / r14.y;
      r11.w = 8 * r11.w;
      r11.w = min(1, r11.w);
      r14.x = -0.25 + r14.x;
      r11.w = r11.w * r14.x + 0.250999987;
      r14.xy = r12.ww / r1.zw;
      r14.xy = float2(1,1) + -r14.xy;
      r14.xy = -abs(r14.xy) + r0.ww;
      r14.xy = float2(4,4) * r14.xy;
      r14.xy = max(float2(0,0), r14.xy);
      r14.xy = float2(0.00100000005,0.00100000005) + r14.xy;
      r14.xy = r14.xy * r11.ww;
      r11.w = saturate(1000 * r13.w);
      r14.xy = r14.xy * r7.yy + float2(-0.0149999997,-0.0149999997);
      r14.xy = r11.ww * r14.xy + float2(0.0149999997,0.0149999997);
      r8.xyzw = r13.xyzw * r14.xxxx + r8.xyzw;
      r10.xyz = r12.xyz * r14.xxx + r10.xyz;
      r9.xyzw = r13.xyzw * r14.yyyy + r9.xyzw;
      r11.xyz = r12.xyz * r14.yyy + r11.xyz;
      r7.zw = r14.xy + r7.zw;
      r10.w = (int)r10.w + 1;
    }
    r3.xyzw = r8.xyzw;
    r4.xyzw = r9.xyzw;
    r5.xyz = r10.xyz;
    r6.xyz = r11.xyz;
    r2.w = r7.z;
    r5.w = r7.w;
    r6.w = (int)r6.w + 1;
  }
  r0.x = cmp(0 != r2.w);
  r2.xyzw = r3.xyzw / r2.wwww;
  r0.y = dot(r5.xyz, r5.xyz);
  r0.y = rsqrt(r0.y);
  r0.yzw = r5.xyz * r0.yyy;
  r2.xyzw = r0.xxxx ? r2.xyzw : r3.xyzw;
  r0.xyz = r0.xxx ? r0.yzw : r5.xyz;
  r1.x = cmp(0 != r5.w);
  r3.xyzw = r4.xyzw / r5.wwww;
  r1.y = dot(r6.xyz, r6.xyz);
  r1.y = rsqrt(r1.y);
  r5.xyz = r6.xyz * r1.yyy;
  r3.xyzw = r1.xxxx ? r3.xyzw : r4.xyzw;
  r4.xyz = r1.xxx ? r5.xyz : r6.xyz;
  r5.xw = float2(1,1) / r1.zw;
  r6.xy = v1.xy;
  r6.z = 1;
  r6.w = r5.x;

float depth = PS_NearFarClipDist.y / r6.w;
float adj = stereo.x * (depth - stereo.y) / depth / 2;

// r6 is used again below, but with a different depth value, so preserve the
// original otherwise we get outlines around objects.
float4 r6_adj = r6;
r6_adj.x -= adj;

  r1.x = dot(SVO_ReprojectionMatrix._m00_m01_m02_m03, r6_adj.xyzw);
  r1.y = dot(SVO_ReprojectionMatrix._m10_m11_m12_m13, r6_adj.xyzw);
  r6.w = dot(SVO_ReprojectionMatrix._m20_m21_m22_m23, r6_adj.xyzw);
  r1.xy = r1.xy / r6.ww;

// We don't have a depth value after the reprojection matrix (it's a 3x4
// current screen space to previous texture space matrix - the depth was cut
// off), so we re-use the depth from this frame as an approximation:
r1.x += adj;

  r7.xy = SVO_VelocityRT.Sample(SVO_VelocityRT_s, v1.xy).xy;
  r6.w = cmp(r7.x != 0.000000);
  r7.xy = float2(-0.498039216,-0.498039216) + r7.xy;
  r7.zw = r7.xy + r7.xy;
  r7.zw = r7.zw * r7.zw;
  r7.xy = cmp(float2(0,0) < r7.xy);
  r7.xy = r7.xy ? float2(1,1) : float2(-1,-1);
  r7.xy = r7.zw * r7.xy + v1.xy;
  r1.xy = r6.ww ? r7.xy : r1.xy;
  r5.xyz = r6.xyz;

depth = PS_NearFarClipDist.y / r5.w;
adj = stereo.x * (depth - stereo.y) / depth / 2;
r5.x -= adj;

  r6.x = dot(SVO_ReprojectionMatrix._m00_m01_m02_m03, r5.xyzw);
  r6.y = dot(SVO_ReprojectionMatrix._m10_m11_m12_m13, r5.xyzw);
  r5.x = dot(SVO_ReprojectionMatrix._m20_m21_m22_m23, r5.xyzw);
  r5.xy = r6.xy / r5.xx;

r5.x += adj;

  r5.xy = r6.ww ? r7.xy : r5.xy;
  r6.xyzw = sceneRgbSamplerMinPrev.SampleLevel(sceneRgbSamplerMinPrev_s, r1.xy, 0).xyzw;
  r7.xyzw = sceneRgbSamplerMaxPrev.SampleLevel(sceneRgbSamplerMaxPrev_s, r5.xy, 0).xyzw;
  r5.z = SVO_TargetResScale.z * 0.25 + SVO_TargetResScale.w;
  r5.w = -r6.w + r1.z;
  r5.w = saturate(abs(r5.w) * PS_NearFarClipDist.y + -0.25);
  r5.w = r5.z + r5.w;
  r8.xy = cmp(r1.xy < float2(0,0));
  r8.zw = cmp(float2(1,1) < r1.xy);
  r8.x = (int)r8.z | (int)r8.x;
  r8.x = (int)r8.y | (int)r8.x;
  r8.x = (int)r8.w | (int)r8.x;
  r8.x = r8.x ? 0.250000 : 0;
  r5.w = saturate(r8.x + r5.w);
  r8.x = -r7.w + r1.w;
  r8.x = saturate(abs(r8.x) * PS_NearFarClipDist.y + -0.25);
  r5.z = r8.x + r5.z;
  r8.xy = cmp(r5.xy < float2(0,0));
  r8.zw = cmp(float2(1,1) < r5.xy);
  r8.x = (int)r8.z | (int)r8.x;
  r8.x = (int)r8.y | (int)r8.x;
  r8.x = (int)r8.w | (int)r8.x;
  r8.x = r8.x ? 0.250000 : 0;
  r5.z = saturate(r8.x + r5.z);
  r0.w = r1.z;
  r0.xyzw = -r6.xyzw + r0.xyzw;
  r0.xyzw = r5.wwww * r0.xyzw + r6.xyzw;
  r0.xyzw = max(float4(-8,-8,-8,-8), r0.xyzw);
  o0.xyzw = min(float4(8,8,8,8), r0.xyzw);
  r0.xyzw = sceneAldSamplerMinPrev.SampleLevel(sceneAldSamplerMinPrev_s, r1.xy, 0).xyzw;
  r2.xyzw = r2.xyzw + -r0.xyzw;
  r0.xyzw = r5.wwww * r2.xyzw + r0.xyzw;
  r0.xyzw = max(float4(-8,-8,-8,-8), r0.xyzw);
  o1.xyzw = min(float4(8,8,8,8), r0.xyzw);
  r4.w = r1.w;
  r0.xyzw = -r7.xyzw + r4.xyzw;
  r0.xyzw = r5.zzzz * r0.xyzw + r7.xyzw;
  r0.xyzw = max(float4(-8,-8,-8,-8), r0.xyzw);
  o2.xyzw = min(float4(8,8,8,8), r0.xyzw);
  r0.xyzw = sceneAldSamplerMaxPrev.SampleLevel(sceneAldSamplerMaxPrev_s, r5.xy, 0).xyzw;
  r1.xyzw = r3.xyzw + -r0.xyzw;
  r0.xyzw = r5.zzzz * r1.xyzw + r0.xyzw;
  r0.xyzw = max(float4(-8,-8,-8,-8), r0.xyzw);
  o3.xyzw = min(float4(8,8,8,8), r0.xyzw);
  return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) HLSL Shader Compiler 9.30.960.8229
//
//   using 3Dmigoto v1.3.3 on Sat Mar 17 06:37:26 2018
//
//
// Buffer Definitions:
//
// cbuffer PER_BATCH
// {
//
//   float4 PS_WorldViewPos;            // Offset:    0 Size:    16 [unused]
//   float4 SvoParamsMisc3;             // Offset:   16 Size:    16 [unused]
//   float4 PS_NearFarClipDist;         // Offset:   32 Size:    16
//   float4 SVO_AnalyticalOccluders[256];// Offset:   48 Size:  4096 [unused]
//   row_major float3x4 SVO_ReprojectionMatrix;// Offset: 4144 Size:    48
//   float4 PS_ScreenSize;              // Offset: 4192 Size:    16
//   float4 SVO_TargetResScale;         // Offset: 4208 Size:    16
//
// }
//
//
// Resource Bindings:
//
// Name                                 Type  Format         Dim Slot Elements
// ------------------------------ ---------- ------- ----------- ---- --------
// sceneRgbSamplerMinPrev            sampler      NA          NA    0        1
// sceneAldSamplerMinPrev            sampler      NA          NA    1        1
// sceneRgbSamplerMaxPrev            sampler      NA          NA    2        1
// sceneAldSamplerMaxPrev            sampler      NA          NA    3        1
// sceneDepthMapSampler              sampler      NA          NA    4        1
// SVO_VelocityRT                    sampler      NA          NA    8        1
// sceneAldSampler                   sampler      NA          NA   10        1
// sceneRgbSampler                   sampler      NA          NA   11        1
// sceneGBuffer0                     sampler      NA          NA   14        1
// sceneRgbSamplerMinPrev            texture  float4          2d    0        1
// sceneAldSamplerMinPrev            texture  float4          2d    1        1
// sceneRgbSamplerMaxPrev            texture  float4          2d    2        1
// sceneAldSamplerMaxPrev            texture  float4          2d    3        1
// sceneDepthMapSampler              texture  float4          2d    4        1
// SVO_VelocityRT                    texture  float4          2d    8        1
// sceneAldSampler                   texture  float4          2d   10        1
// sceneRgbSampler                   texture  float4          2d   11        1
// sceneGBuffer0                     texture  float4          2d   14        1
// PER_BATCH                         cbuffer      NA          NA    0        1
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Position              0   xyzw        0      POS   float
// TEXCOORD                 0   xyzw        1     NONE   float   xy
// TEXCOORD                 1   xyzw        2     NONE   float   xyz
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_Target                0   xyzw        0   TARGET   float   xyzw
// SV_Target                1   xyzw        1   TARGET   float   xyzw
// SV_Target                2   xyzw        2   TARGET   float   xyzw
// SV_Target                3   xyzw        3   TARGET   float   xyzw
//
ps_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[264], immediateIndexed
dcl_sampler s0, mode_default
dcl_sampler s1, mode_default
dcl_sampler s2, mode_default
dcl_sampler s3, mode_default
dcl_sampler s4, mode_default
dcl_sampler s8, mode_default
dcl_sampler s10, mode_default
dcl_sampler s11, mode_default
dcl_sampler s14, mode_default
dcl_resource_texture2d (float,float,float,float) t0
dcl_resource_texture2d (float,float,float,float) t1
dcl_resource_texture2d (float,float,float,float) t2
dcl_resource_texture2d (float,float,float,float) t3
dcl_resource_texture2d (float,float,float,float) t4
dcl_resource_texture2d (float,float,float,float) t8
dcl_resource_texture2d (float,float,float,float) t10
dcl_resource_texture2d (float,float,float,float) t11
dcl_resource_texture2d (float,float,float,float) t14
dcl_input_ps linear v1.xy
dcl_input_ps linear v2.xyz
dcl_output o0.xyzw
dcl_output o1.xyzw
dcl_output o2.xyzw
dcl_output o3.xyzw
dcl_temps 15
sample_indexable(texture2d)(float,float,float,float) r0.x, v1.xyxx, t4.xyzw, s4
mul r0.yzw, r0.xxxx, v2.xxyz
div r1.xy, l(0.500000, 0.500000, 0.000000, 0.000000), cb0[262].xyxx
mov r1.zw, r0.xxxx
mov r2.xyzw, l(0,0,0,0)
loop
  ilt r3.x, l(1), r2.w
  breakc_nz r3.x
  itof r3.x, r2.w
  mov r4.xyz, r2.xyzx
  mov r3.zw, r1.zzzw
  mov r4.w, l(0)
  loop
    ilt r5.x, l(1), r4.w
    breakc_nz r5.x
    itof r3.y, r4.w
    mad r5.xy, r1.xyxx, r3.xyxx, v1.xyxx
    sample_indexable(texture2d)(float,float,float,float) r3.y, r5.xyxx, t4.yxzw, s4
    min r3.z, r3.y, r3.z
    max r3.w, r3.y, r3.w
    div r3.y, r0.x, r3.y
    add r3.y, -r3.y, l(1.000000)
    add r3.y, -|r3.y|, l(0.120000)
    max r3.y, r3.y, l(0.000000)
    add r3.y, r3.y, l(0.001000)
    sample_indexable(texture2d)(float,float,float,float) r5.xyz, r5.xyxx, t14.xyzw, s14
    mad r5.xyz, r5.xyzx, l(2.000000, 2.000000, 2.000000, 0.000000), l(-1.000000, -1.000000, -1.000000, 0.000000)
    dp3 r5.w, r5.xyzx, r5.xyzx
    rsq r5.w, r5.w
    mul r5.xyz, r5.wwww, r5.xyzx
    mad r4.xyz, r5.xyzx, r3.yyyy, r4.xyzx
    iadd r4.w, r4.w, l(1)
  endloop
  mov r2.xyz, r4.xyzx
  mov r1.zw, r3.zzzw
  iadd r2.w, r2.w, l(1)
endloop
dp3 r0.x, r2.xyzx, r2.xyzx
rsq r0.x, r0.x
mul r2.xyz, r0.xxxx, r2.xyzx
dp3 r0.x, r0.yzwy, r0.yzwy
sqrt r0.x, r0.x
round_z r0.yz, cb0[262].xxyx
div r0.yz, l(0.000000, 2.000000, 2.000000, 0.000000), r0.yyzy
dp3 r0.w, v2.xyzx, v2.xyzx
rsq r0.w, r0.w
mul r3.xyz, r0.wwww, v2.xyzx
dp3 r0.w, r3.xyzx, -r2.xyzx
add_sat r0.w, -r0.w, l(1.000000)
mad r0.w, r0.w, l(0.080000), l(0.120000)
mul r3.xyzw, r0.yzyz, l(0.500000, 0.500000, 8.000000, 8.000000)
div r1.xy, v1.xyxx, r3.xyxx
round_z r1.xy, r1.xyxx
mad r1.xy, r1.xyxx, r3.xyxx, r3.xyxx
mad r3.xy, -r0.yzyy, l(8.000000, 8.000000, 0.000000, 0.000000), l(1.000000, 1.000000, 0.000000, 0.000000)
max r1.xy, r3.zwzz, r1.xyxx
min r1.xy, r3.xyxx, r1.xyxx
mad r0.x, -r0.x, l(0.062500), l(1.000000)
max r0.x, r0.x, l(0.000000)
mad r0.x, r0.x, l(0.500000), l(1.200000)
mov r3.xyzw, l(0,0,0,0)
mov r4.xyzw, l(0,0,0,0)
mov r2.w, l(0)
mov r5.xyzw, l(0,0,0,0)
mov r6.xyzw, l(0,0,0,-8)
loop
  ilt r7.x, l(8), r6.w
  breakc_nz r7.x
  itof r7.x, r6.w
  mov r8.xyzw, r3.xyzw
  mov r9.xyzw, r4.xyzw
  mov r10.xyz, r5.xyzx
  mov r11.xyz, r6.xyzx
  mov r7.z, r2.w
  mov r7.w, r5.w
  mov r10.w, l(-8)
  loop
    ilt r11.w, l(8), r10.w
    breakc_nz r11.w
    itof r7.y, r10.w
    mad_sat r12.xy, r0.yzyy, r7.xyxx, r1.xyxx
    sample_l_indexable(texture2d)(float,float,float,float) r13.xyzw, r12.xyxx, t10.xyzw, s10, l(0.000000)
    sample_l_indexable(texture2d)(float,float,float,float) r12.xyzw, r12.xyxx, t11.xyzw, s11, l(0.000000)
    imul null, r7.y, r10.w, r10.w
    imad r7.y, r6.w, r6.w, r7.y
    itof r7.y, r7.y
    sqrt r7.y, r7.y
    mad_sat r7.y, -r7.y, l(0.125000), r0.x
    dp3 r11.w, r13.xyzx, r13.xyzx
    rsq r14.x, r11.w
    mul r14.xyz, r13.xyzx, r14.xxxx
    dp3 r14.x, r14.xyzx, r2.xyzx
    add_sat r14.x, r14.x, l(-0.250000)
    sqrt r11.w, r11.w
    max r14.y, r13.w, l(0.000100)
    div r11.w, r11.w, r14.y
    mul r11.w, r11.w, l(8.000000)
    min r11.w, r11.w, l(1.000000)
    add r14.x, r14.x, l(-0.250000)
    mad r11.w, r11.w, r14.x, l(0.251000)
    div r14.xy, r12.wwww, r1.zwzz
    add r14.xy, -r14.xyxx, l(1.000000, 1.000000, 0.000000, 0.000000)
    add r14.xy, r0.wwww, -|r14.xyxx|
    mul r14.xy, r14.xyxx, l(4.000000, 4.000000, 0.000000, 0.000000)
    max r14.xy, r14.xyxx, l(0.000000, 0.000000, 0.000000, 0.000000)
    add r14.xy, r14.xyxx, l(0.001000, 0.001000, 0.000000, 0.000000)
    mul r14.xy, r11.wwww, r14.xyxx
    mul_sat r11.w, r13.w, l(1000.000000)
    mad r14.xy, r14.xyxx, r7.yyyy, l(-0.015000, -0.015000, 0.000000, 0.000000)
    mad r14.xy, r11.wwww, r14.xyxx, l(0.015000, 0.015000, 0.000000, 0.000000)
    mad r8.xyzw, r13.xyzw, r14.xxxx, r8.xyzw
    mad r10.xyz, r12.xyzx, r14.xxxx, r10.xyzx
    mad r9.xyzw, r13.xyzw, r14.yyyy, r9.xyzw
    mad r11.xyz, r12.xyzx, r14.yyyy, r11.xyzx
    add r7.zw, r7.zzzw, r14.xxxy
    iadd r10.w, r10.w, l(1)
  endloop
  mov r3.xyzw, r8.xyzw
  mov r4.xyzw, r9.xyzw
  mov r5.xyz, r10.xyzx
  mov r6.xyz, r11.xyzx
  mov r2.w, r7.z
  mov r5.w, r7.w
  iadd r6.w, r6.w, l(1)
endloop
ne r0.x, l(0.000000, 0.000000, 0.000000, 0.000000), r2.w
div r2.xyzw, r3.xyzw, r2.wwww
dp3 r0.y, r5.xyzx, r5.xyzx
rsq r0.y, r0.y
mul r0.yzw, r0.yyyy, r5.xxyz
movc r2.xyzw, r0.xxxx, r2.xyzw, r3.xyzw
movc r0.xyz, r0.xxxx, r0.yzwy, r5.xyzx
ne r1.x, l(0.000000, 0.000000, 0.000000, 0.000000), r5.w
div r3.xyzw, r4.xyzw, r5.wwww
dp3 r1.y, r6.xyzx, r6.xyzx
rsq r1.y, r1.y
mul r5.xyz, r1.yyyy, r6.xyzx
movc r3.xyzw, r1.xxxx, r3.xyzw, r4.xyzw
movc r4.xyz, r1.xxxx, r5.xyzx, r6.xyzx
div r5.xw, l(1.000000, 1.000000, 1.000000, 1.000000), r1.zzzw
mov r6.xy, v1.xyxx
mov r6.z, l(1.000000)
mov r6.w, r5.x
dp4 r1.x, cb0[259].xyzw, r6.xyzw
dp4 r1.y, cb0[260].xyzw, r6.xyzw
dp4 r6.w, cb0[261].xyzw, r6.xyzw
div r1.xy, r1.xyxx, r6.wwww
sample_indexable(texture2d)(float,float,float,float) r7.xy, v1.xyxx, t8.xyzw, s8
ne r6.w, r7.x, l(0.000000)
add r7.xy, r7.xyxx, l(-0.498039216, -0.498039216, 0.000000, 0.000000)
add r7.zw, r7.xxxy, r7.xxxy
mul r7.zw, r7.zzzw, r7.zzzw
lt r7.xy, l(0.000000, 0.000000, 0.000000, 0.000000), r7.xyxx
movc r7.xy, r7.xyxx, l(1.000000,1.000000,0,0), l(-1.000000,-1.000000,0,0)
mad r7.xy, r7.zwzz, r7.xyxx, v1.xyxx
movc r1.xy, r6.wwww, r7.xyxx, r1.xyxx
mov r5.xyz, r6.xyzx
dp4 r6.x, cb0[259].xyzw, r5.xyzw
dp4 r6.y, cb0[260].xyzw, r5.xyzw
dp4 r5.x, cb0[261].xyzw, r5.xyzw
div r5.xy, r6.xyxx, r5.xxxx
movc r5.xy, r6.wwww, r7.xyxx, r5.xyxx
sample_l_indexable(texture2d)(float,float,float,float) r6.xyzw, r1.xyxx, t0.xyzw, s0, l(0.000000)
sample_l_indexable(texture2d)(float,float,float,float) r7.xyzw, r5.xyxx, t2.xyzw, s2, l(0.000000)
mad r5.z, cb0[263].z, l(0.250000), cb0[263].w
add r5.w, r1.z, -r6.w
mad_sat r5.w, |r5.w|, cb0[2].y, l(-0.250000)
add r5.w, r5.w, r5.z
lt r8.xy, r1.xyxx, l(0.000000, 0.000000, 0.000000, 0.000000)
lt r8.zw, l(0.000000, 0.000000, 1.000000, 1.000000), r1.xxxy
or r8.x, r8.z, r8.x
or r8.x, r8.y, r8.x
or r8.x, r8.w, r8.x
and r8.x, r8.x, l(0x3e800000)
add_sat r5.w, r5.w, r8.x
add r8.x, r1.w, -r7.w
mad_sat r8.x, |r8.x|, cb0[2].y, l(-0.250000)
add r5.z, r5.z, r8.x
lt r8.xy, r5.xyxx, l(0.000000, 0.000000, 0.000000, 0.000000)
lt r8.zw, l(0.000000, 0.000000, 1.000000, 1.000000), r5.xxxy
or r8.x, r8.z, r8.x
or r8.x, r8.y, r8.x
or r8.x, r8.w, r8.x
and r8.x, r8.x, l(0x3e800000)
add_sat r5.z, r5.z, r8.x
mov r0.w, r1.z
add r0.xyzw, r0.xyzw, -r6.xyzw
mad r0.xyzw, r5.wwww, r0.xyzw, r6.xyzw
max r0.xyzw, r0.xyzw, l(-8.000000, -8.000000, -8.000000, -8.000000)
min o0.xyzw, r0.xyzw, l(8.000000, 8.000000, 8.000000, 8.000000)
sample_l_indexable(texture2d)(float,float,float,float) r0.xyzw, r1.xyxx, t1.xyzw, s1, l(0.000000)
add r2.xyzw, -r0.xyzw, r2.xyzw
mad r0.xyzw, r5.wwww, r2.xyzw, r0.xyzw
max r0.xyzw, r0.xyzw, l(-8.000000, -8.000000, -8.000000, -8.000000)
min o1.xyzw, r0.xyzw, l(8.000000, 8.000000, 8.000000, 8.000000)
mov r4.w, r1.w
add r0.xyzw, r4.xyzw, -r7.xyzw
mad r0.xyzw, r5.zzzz, r0.xyzw, r7.xyzw
max r0.xyzw, r0.xyzw, l(-8.000000, -8.000000, -8.000000, -8.000000)
min o2.xyzw, r0.xyzw, l(8.000000, 8.000000, 8.000000, 8.000000)
sample_l_indexable(texture2d)(float,float,float,float) r0.xyzw, r5.xyxx, t3.xyzw, s3, l(0.000000)
add r1.xyzw, -r0.xyzw, r3.xyzw
mad r0.xyzw, r5.zzzz, r1.xyzw, r0.xyzw
max r0.xyzw, r0.xyzw, l(-8.000000, -8.000000, -8.000000, -8.000000)
min o3.xyzw, r0.xyzw, l(8.000000, 8.000000, 8.000000, 8.000000)
ret
// Approximately 206 instruction slots used

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/