#version 310 es
precision mediump float;

struct Params {
  uint filterDim;
  uint blockDim;
};

layout(binding = 1) uniform Params_1 {
  uint filterDim;
  uint blockDim;
} params;

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

layout(binding = 3) uniform Flip_1 {
  uint value;
} flip;

shared vec3 tile[4][256];
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, 0.0f, 0.0f);
    }
  }
  memoryBarrierShared();
  uint filterOffset = ((params.filterDim - 1u) / 2u);
  ivec2 dims = textureSize(inputTex_1, 0);
  ivec2 baseIndex = (ivec2(((WorkGroupID.xy * uvec2(params.blockDim, 4u)) + (LocalInvocationID.xy * uvec2(4u, 1u)))) - ivec2(int(filterOffset), 0));
  {
    for(uint r = 0u; (r < 4u); r = (r + 1u)) {
      {
        for(uint c = 0u; (c < 4u); c = (c + 1u)) {
          ivec2 loadIndex = (baseIndex + ivec2(int(c), int(r)));
          if ((flip.value != 0u)) {
            loadIndex = loadIndex.yx;
          }
          tile[r][((4u * LocalInvocationID.x) + c)] = textureLod(inputTex_samp, ((vec2(loadIndex) + vec2(0.25f, 0.25f)) / vec2(dims)), 0.0f).rgb;
        }
      }
    }
  }
  memoryBarrierShared();
  {
    for(uint r = 0u; (r < 4u); r = (r + 1u)) {
      {
        for(uint c = 0u; (c < 4u); c = (c + 1u)) {
          ivec2 writeIndex = (baseIndex + ivec2(int(c), int(r)));
          if ((flip.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, 0.0f, 0.0f);
            {
              for(uint f = 0u; (f < params.filterDim); f = (f + 1u)) {
                uint i = ((center + f) - filterOffset);
                acc = (acc + ((1.0f / float(params.filterDim)) * tile[r][i]));
              }
            }
            imageStore(outputTex, 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;
}
