#version 130
#extension GL_ARB_texture_gather : enable

vec3 a;
float b;

in vec4 i;
out vec4 o;
out ivec3 io;
out uvec4 uo;

flat in float fflat;
smooth in float fsmooth;
noperspective in float fnop;

uniform samplerCube sampC;

in vec4 gl_Color;
flat in vec4 gl_Color;

#extension GL_ARB_texture_rectangle : enable

uniform sampler2D samp2D;
uniform sampler2DShadow samp2DS;
uniform sampler2DRect samp2DR;
uniform sampler2DArray samp2DA;

void bar3()
{
    o += textureGatherOffset(samp2D, vec2(0.3), ivec2(1));
    o += textureGatherOffset(samp2DA, vec3(0.3), ivec2(1));
}

#extension GL_ARB_gpu_shader5 : enable

void bar4()
{
    o += textureGatherOffset(samp2DR, vec2(0.3), ivec2(1));
    o += textureGatherOffset(samp2DS, vec2(0.3), 1.3, ivec2(1));
    o += textureGatherOffset(samp2D, vec2(0.3), ivec2(1), 2);
}

#extension GL_ARB_texture_cube_map_array : enable

uniform  samplerCubeArray Sca;
uniform isamplerCubeArray Isca;
uniform usamplerCubeArray Usca;
uniform samplerCubeArrayShadow Scas;

void bar5()
{
    io = textureSize(Sca, 3);
    o += texture(Sca, i);
    io += texture(Isca, i, 0.7).xyz;
    uo = texture(Usca, i);
    
    o += textureLod(Sca, i, 1.7);
    a = textureSize(Scas, 3);
    float f = texture(Scas, i, i.y);
    ivec4 c = textureGrad(Isca, i, vec3(0.1), vec3(0.2));
    o += vec4(a, f + c);
}

#extension GL_ARB_shading_language_420pack : enable

const int ai[3] = { 10, 23, 32 };
uniform layout(binding=0) sampler2D bounds;

void bar6()
{
    mat4x3 m43;
    float a1 = m43[3].y;
    //int a2 = m43.length();  // ERROR until shading_language_420pack is fully implemented
    const float b = 2 * a1;
    //a.x = gl_MinProgramTexelOffset + gl_MaxProgramTexelOffset;    // ERROR until shading_language_420pack is fully implemented
}


#extension GL_ARB_texture_rectangle : enable
#extension GL_ARB_shader_texture_lod : require

uniform sampler2D s2D;
uniform sampler2DRect s2DR;
uniform sampler2DRectShadow s2DRS;
uniform sampler1D s1D;
uniform sampler2DShadow s2DS;

uniform float f;
uniform vec2 v2;
uniform vec3 v3;
uniform vec4 v4;

void bar7()
{
    vec4 v;

    o += texture2DRect(s2DR, v2);
    o += texture2DRectProj(s2DR, v3);
    o += texture2DRectProj(s2DR, v4);
    o += shadow2DRect(s2DRS, v3);
    o += shadow2DRectProj(s2DRS, v4);

    o += texture1DGradARB(s1D, f, f, f);
    o += texture2DProjGradARB(s2D, v, v2, v2);
    o += shadow2DProjGradARB(s2DS, v, v2, v2);

    o += shadow2DRectProjGradARB(s2DRS, v, v2, v2);
}

void main()
{
    o = textureGather(sampC, vec3(0.2));
    o.y =  gl_ClipDistance[3];
    bar3();
    bar4();
    bar5();
    bar6();
    bar7();
}