#if __VERSION__ == 300
  vec4 textureGather(sampler2D tex, vec2 uv, int comp)
  {
    vec4 c0 = textureOffset(tex, uv, ivec2(0,1));
    vec4 c1 = textureOffset(tex, uv, ivec2(1,1));
    vec4 c2 = textureOffset(tex, uv, ivec2(1,0));
    vec4 c3 = textureOffset(tex, uv, ivec2(0,0));
    return vec4(c0[comp], c1[comp], c2[comp],c3[comp]);
  }
#elif __VERSION__ < 300
  vec4 textureGather(sampler2D tex, vec2 uv, int comp)
  {
    vec4 c3 = texture2D(tex, uv);
    return vec4(c3[comp], c3[comp], c3[comp],c3[comp]);
  }
#endif

#if __VERSION__ < 310
  uint bitfieldExtract(uint val, int off, int size)
  {
    uint mask = uint((1 << size) - 1);
    return uint(val >> off) & mask;
  }

  uint bitfieldInsert(uint a, uint b, int c, int d)
  {
    uint mask = ~(0xffffffffu << d) << c;
    mask = ~mask;
    a &= mask;
    return a | (b << c);
  }
#endif