// This pseudo code shows how madVR is calculating the luma variance
// as part of the madVR downscaling shaders. Shiandow's original
// downscaling and variance calculation kernels are not used by madVR.

float3 result = 0;
float weightSum = 0;
float varMean = 0;
float varM2 = 0;

for (int x = startPos; x <= endPos; x++)
{
  float3 pix = GetYuvPix(x);
  float weight = CalcWeight(x);
  result += pix * weight;
  float varDelta = pix[0] - varMean;
  float varR = varDelta * weight / (weightSum + weight);
  varMean += varR;
  varM2 += weightSum * varDelta * varR;
  weightSum += weight;
}

return float4(result, varM2) / weightSum;
