typedef struct FragmentTestRec {
	const char * name;
	uint32_t texCount;
	const char * txt;
} FragmentTest;

static FragmentTest fpFill = {
	"Solid color", 0,

    "precision mediump float;\n"
    "uniform vec4 u_color;\n"
    "void main() {\n"
    "  gl_FragColor = u_color;\n"
    "}\n"
};

static FragmentTest fpGradient = {
	"Solid gradient", 0,

    "precision mediump float;\n"
    "varying lowp vec4 v_color;\n"
    "void main() {\n"
    "  gl_FragColor = v_color;\n"
    "}\n"
};

static FragmentTest fpCopyTex = {
	"Texture copy", 1,

    "precision mediump float;\n"
    "varying vec2 v_tex0;\n"
    "uniform sampler2D u_tex0;\n"
    "void main() {\n"
    "  gl_FragColor = texture2D(u_tex0, v_tex0);\n"
    "}\n"
};

static FragmentTest fpCopyTexGamma = {
	"Texture copy with gamma", 1,

    "precision mediump float;\n"
    "varying vec2 v_tex0;\n"
    "uniform sampler2D u_tex0;\n"
    "void main() {\n"
    "  vec4 t = texture2D(u_tex0, v_tex0);\n"
    "  t.rgb = pow(t.rgb, vec3(1.4, 1.4, 1.4));\n"
    "  gl_FragColor = t;\n"
    "}\n"
};

static FragmentTest fpTexSpec = {
	"Texture spec", 1,

    "precision mediump float;\n"
    "varying vec2 v_tex0;\n"
    "uniform sampler2D u_tex0;\n"
    "void main() {\n"
    "  vec4 t = texture2D(u_tex0, v_tex0);\n"
    "  float simSpec = dot(gl_FragCoord.xyz, gl_FragCoord.xyz);\n"
    "  simSpec = pow(clamp(simSpec, 0.1, 1.0), 40.0);\n"
    "  gl_FragColor = t + vec4(simSpec, simSpec, simSpec, simSpec);\n"
    "}\n"
};

static FragmentTest fpDepTex = {
	"Dependent Lookup", 1,

    "precision mediump float;\n"
    "varying vec2 v_tex0;\n"
    "uniform sampler2D u_tex0;\n"
    "void main() {\n"
    "  vec4 t = texture2D(u_tex0, v_tex0);\n"
    "  t += texture2D(u_tex0, t.xy);\n"
    "  gl_FragColor = t;\n"
    "}\n"
};

static FragmentTest fpModulateConstantTex = {
	"Texture modulate constant", 1,

    "precision mediump float;\n"
    "varying vec2 v_tex0;\n"
    "uniform sampler2D u_tex0;\n"
    "uniform vec4 u_color;\n"

    "void main() {\n"
    "  lowp vec4 c = texture2D(u_tex0, v_tex0);\n"
	"  c *= u_color;\n"
    "  gl_FragColor = c;\n"
    "}\n"
};

static FragmentTest fpModulateVaryingTex = {
	"Texture modulate gradient", 1,

    "precision mediump float;\n"
    "varying vec2 v_tex0;\n"
    "varying lowp vec4 v_color;\n"
    "uniform sampler2D u_tex0;\n"

    "void main() {\n"
    "  lowp vec4 c = texture2D(u_tex0, v_tex0);\n"
	"  c *= v_color;\n"
    "  gl_FragColor = c;\n"
    "}\n"
};

static FragmentTest fpModulateVaryingConstantTex = {
	"Texture modulate gradient constant", 1,

    "precision mediump float;\n"
    "varying vec2 v_tex0;\n"
    "varying lowp vec4 v_color;\n"
    "uniform sampler2D u_tex0;\n"
    "uniform vec4 u_color;\n"

    "void main() {\n"
    "  lowp vec4 c = texture2D(u_tex0, v_tex0);\n"
	"  c *= v_color;\n"
	"  c *= u_color;\n"
    "  gl_FragColor = c;\n"
    "}\n"
};

static FragmentTest *gFragmentTests[] = {
	&fpFill,
	&fpGradient,
	&fpCopyTex,
	&fpCopyTexGamma,
   &fpTexSpec,
   &fpDepTex,
	&fpModulateConstantTex,
	&fpModulateVaryingTex,
	&fpModulateVaryingConstantTex,

};

static const size_t gFragmentTestCount = sizeof(gFragmentTests) / sizeof(gFragmentTests[0]);