#version 310 es

struct Params {
  uint filterDim;
  uint blockDim;
  uint pad;
  uint pad_1;
};

layout(binding = 1, std140) uniform params_block_ubo {
  Params inner;
} params;

layout(rgba8) uniform highp writeonly image2D outputTex;
struct Flip {
  uint value;
  uint pad_2;
  uint pad_3;
  uint pad_4;
};

layout(binding = 3, std140) uniform flip_block_ubo {
  Flip inner;
} flip;

shared vec3 tile[4][256];
uint tint_div(uint lhs, uint rhs) {
  return (lhs / ((rhs == 0u) ? 1u : rhs));
}

uniform highp sampler2D inputTex_1;
uniform highp sampler2D inputTex_samp;

void tint_symbol(uvec3 WorkGroupID, uvec3 LocalInvocationID, uint local_invocation_index) {
  {
    for(uint idx = local_invocation_index; (idx < 1024u); idx = (idx + 64u)) {
      uint i_1 = (idx / 256u);
      uint i_2 = (idx % 256u);
      tile[i_1][i_2] = vec3(0.0f);
    }
  }
  barrier();
  uint filterOffset = tint_div((params.inner.filterDim - 1u), 2u);
  uvec2 dims = uvec2(textureSize(inputTex_1, 0));
  uvec2 baseIndex = (((WorkGroupID.xy * uvec2(params.inner.blockDim, 4u)) + (LocalInvocationID.xy * uvec2(4u, 1u))) - uvec2(filterOffset, 0u));
  {
    for(uint r = 0u; (r < 4u); r = (r + 1u)) {
      {
        for(uint c = 0u; (c < 4u); c = (c + 1u)) {
          uvec2 loadIndex = (baseIndex + uvec2(c, r));
          if ((flip.inner.value != 0u)) {
            loadIndex = loadIndex.yx;
          }
          tile[r][((4u * LocalInvocationID.x) + c)] = textureLod(inputTex_samp, ((vec2(loadIndex) + vec2(0.25f)) / vec2(dims)), 0.0f).rgb;
        }
      }
    }
  }
  barrier();
  {
    for(uint r = 0u; (r < 4u); r = (r + 1u)) {
      {
        for(uint c = 0u; (c < 4u); c = (c + 1u)) {
          uvec2 writeIndex = (baseIndex + uvec2(c, r));
          if ((flip.inner.value != 0u)) {
            writeIndex = writeIndex.yx;
          }
          uint center = ((4u * LocalInvocationID.x) + c);
          bool tint_tmp_1 = (center >= filterOffset);
          if (tint_tmp_1) {
            tint_tmp_1 = (center < (256u - filterOffset));
          }
          bool tint_tmp = (tint_tmp_1);
          if (tint_tmp) {
            tint_tmp = all(lessThan(writeIndex, dims));
          }
          if ((tint_tmp)) {
            vec3 acc = vec3(0.0f);
            {
              for(uint f = 0u; (f < params.inner.filterDim); f = (f + 1u)) {
                uint i = ((center + f) - filterOffset);
                acc = (acc + ((1.0f / float(params.inner.filterDim)) * tile[r][i]));
              }
            }
            imageStore(outputTex, ivec2(writeIndex), vec4(acc, 1.0f));
          }
        }
      }
    }
  }
}

layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
void main() {
  tint_symbol(gl_WorkGroupID, gl_LocalInvocationID, gl_LocalInvocationIndex);
  return;
}
