787 lines
18 KiB
Plaintext
787 lines
18 KiB
Plaintext
|
|
group varying "Varying linkage"
|
|
group rules "Rules"
|
|
|
|
case type_mismatch
|
|
version 310 es
|
|
desc "Tessellation output and geometry input type mismatch"
|
|
expect link_fail
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float vtx_out;
|
|
void main()
|
|
{
|
|
vtx_out = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump float vtx_out[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out mediump float te_out;
|
|
void main()
|
|
{
|
|
te_out = tc_out[2];
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in mediump vec2 te_out[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = te_out[ndx].y;
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case different_precision
|
|
version 310 es
|
|
desc "Tessellation output and geometry input precisions are different"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float vtx_out;
|
|
void main()
|
|
{
|
|
vtx_out = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump float vtx_out[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out mediump float te_out;
|
|
void main()
|
|
{
|
|
te_out = tc_out[2];
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in highp float te_out[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = te_out[ndx];
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case no_output_declaration
|
|
version 310 es
|
|
desc "Geometry input has no matching output"
|
|
expect link_fail
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float vtx_out;
|
|
void main()
|
|
{
|
|
vtx_out = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump float vtx_out[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out mediump float te_out;
|
|
void main()
|
|
{
|
|
te_out = tc_out[2];
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in mediump float te_out[];
|
|
in mediump float te_out_nonexistent[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = te_out[ndx] + te_out_nonexistent[ndx];
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case superfluous_output_declaration
|
|
version 310 es
|
|
desc "Tessellation shader output is never used"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float vtx_out;
|
|
void main()
|
|
{
|
|
vtx_out = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump float vtx_out[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out mediump float te_out;
|
|
out mediump float te_out_nonexistent;
|
|
void main()
|
|
{
|
|
te_out = tc_out[2];
|
|
te_out_nonexistent = tc_out[0];
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in mediump float te_out[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = te_out[ndx];
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vertex_geometry_same_varying_name_1
|
|
version 310 es
|
|
desc "Vertex output and geometry input share the same name"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float sharedVaringName;
|
|
void main()
|
|
{
|
|
sharedVaringName = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump float sharedVaringName[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID];
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out mediump float sharedVaringName;
|
|
void main()
|
|
{
|
|
sharedVaringName = tc_out[2];
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in mediump float sharedVaringName[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = sharedVaringName[ndx];
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vertex_geometry_same_varying_name_2
|
|
version 310 es
|
|
desc "Vertex output and geometry input share the same name"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input vec2 in0 = vec2(1.0, 1.0);
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump vec2 sharedVaringName;
|
|
void main()
|
|
{
|
|
sharedVaringName = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump vec2 sharedVaringName[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = 2.0 * sharedVaringName[gl_InvocationID].x - sharedVaringName[gl_InvocationID].y;
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out mediump float sharedVaringName;
|
|
void main()
|
|
{
|
|
sharedVaringName = tc_out[2];
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in mediump float sharedVaringName[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = sharedVaringName[ndx];
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case io_block
|
|
version 310 es
|
|
desc "Use of io block between tessellation and geometry shaders"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float vtx_out;
|
|
void main()
|
|
{
|
|
vtx_out = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump float vtx_out[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out IOBlockName { mediump float val; } instanceName;
|
|
void main()
|
|
{
|
|
instanceName.val = tc_out[2];
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in IOBlockName { mediump float val; } instanceName[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
geo_out = instanceName[0].val;
|
|
gl_Position = gl_in[0].gl_Position;
|
|
EmitVertex();
|
|
|
|
geo_out = instanceName[1].val;
|
|
gl_Position = gl_in[1].gl_Position;
|
|
EmitVertex();
|
|
|
|
geo_out = instanceName[2].val;
|
|
gl_Position = gl_in[2].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case array_in_io_block
|
|
version 310 es
|
|
desc "Float array in a io block between tessellation and geometry shaders"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float vtx_out;
|
|
void main()
|
|
{
|
|
vtx_out = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
in mediump float vtx_out[];
|
|
out mediump float tc_out[];
|
|
void main()
|
|
{
|
|
tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
in mediump float tc_out[];
|
|
out IOBlockName { mediump float val[2]; } instanceName;
|
|
void main()
|
|
{
|
|
instanceName.val[0] = tc_out[2] + 1.0;
|
|
instanceName.val[1] = -1.0;
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
in IOBlockName { mediump float val[2]; } instanceName[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
geo_out = instanceName[0].val[0] + instanceName[0].val[1];
|
|
gl_Position = gl_in[0].gl_Position;
|
|
EmitVertex();
|
|
|
|
geo_out = instanceName[1].val[0] + instanceName[1].val[1];
|
|
gl_Position = gl_in[1].gl_Position;
|
|
EmitVertex();
|
|
|
|
geo_out = instanceName[2].val[0] + instanceName[2].val[1];
|
|
gl_Position = gl_in[2].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
end
|
|
|
|
import "linkage_tessellation_geometry_varying_types.test"
|
|
end
|
|
|
|
group uniform "Uniform linkage"
|
|
group rules "Rules"
|
|
case type_mismatch_1
|
|
version 310 es
|
|
desc "Uniform type mismatch"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
void main()
|
|
{
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
uniform mediump float u_value;
|
|
out mediump float te_out;
|
|
void main()
|
|
{
|
|
te_out = u_value;
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
uniform mediump vec2 u_value;
|
|
in mediump float te_out[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = te_out[ndx] + u_value.y;
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
${FRAG_COLOR} = vec4(geo_out);
|
|
}
|
|
""
|
|
end
|
|
|
|
case precision_mismatch_1
|
|
version 310 es
|
|
desc "Uniform precision mismatch"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
void main()
|
|
{
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
uniform mediump float u_value;
|
|
out mediump float te_out;
|
|
void main()
|
|
{
|
|
te_out = u_value;
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
uniform highp float u_value;
|
|
in mediump float te_out[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = te_out[ndx] + u_value;
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
${FRAG_COLOR} = vec4(geo_out);
|
|
}
|
|
""
|
|
end
|
|
|
|
case struct_partial_usage
|
|
version 310 es
|
|
desc "Uniform precision mismatch"
|
|
require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
|
|
require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
|
|
values
|
|
{
|
|
uniform float u_value.teVal = 1.0;
|
|
uniform float u_value.geoVal = 2.0;
|
|
output float out0 = 5.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 310 es
|
|
${TESSELLATION_CONTROL_DECLARATIONS}
|
|
void main()
|
|
{
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 310 es
|
|
${TESSELLATION_EVALUATION_DECLARATIONS}
|
|
struct S
|
|
{
|
|
mediump float teVal;
|
|
mediump float geoVal;
|
|
};
|
|
uniform S u_value;
|
|
out mediump float te_out;
|
|
void main()
|
|
{
|
|
te_out = u_value.teVal;
|
|
${TESSELLATION_EVALUATION_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 310 es
|
|
${GEOMETRY_DECLARATIONS}
|
|
struct S
|
|
{
|
|
mediump float teVal;
|
|
mediump float geoVal;
|
|
};
|
|
uniform S u_value;
|
|
in mediump float te_out[];
|
|
out mediump float geo_out;
|
|
void main()
|
|
{
|
|
for (int ndx = 0; ndx < gl_in.length(); ++ndx)
|
|
{
|
|
geo_out = te_out[ndx] + 2.0 * u_value.geoVal;
|
|
gl_Position = gl_in[ndx].gl_Position;
|
|
EmitVertex();
|
|
}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
end
|
|
end
|