In GLES vertex shader outputs cant be arrays of structs or structs that contain arrays or structs.
The GLSL ES 3.0 spec says: "Vertex output variables output per-vertex data and are declared using the out storage qualifier or the centroid out storage qualifier. They can only be float, floating-point vectors, matrices, signed or unsigned integers or integer vectors, or arrays or structures of any these." The GLSL ES 3.1 is a bit clearer about this: It is a compile-time error to declare a vertex shader output with, or that contains, any of the following types: * A boolean type * An opaque type * An array of arrays * An array of structures * A structure containing an array * A structure containing a structure CC: Mark Janes <[email protected]> --- tests/all.py | 13 +- .../execution/varying-struct-arrays.shader_test | 237 --------------------- 2 files changed, 9 insertions(+), 241 deletions(-) delete mode 100644 tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test diff --git a/tests/all.py b/tests/all.py index 2839059..47fe503 100755 --- a/tests/all.py +++ b/tests/all.py @@ -3287,10 +3287,15 @@ with profile.group_manager( for api_suffix, possible_options in [('', [[], ['interface']]), ('_gles3', [[]])]: - for subtest in ['basic-struct', 'struct-whole-array', - 'struct-array-elem', 'array-struct', - 'array-struct-whole-array', 'array-struct-array-elem', - 'struct-struct', 'array-struct-array-struct']: + if api_suffix == '_gles3': + subtest_list = ['basic-struct'] + else: + subtest_list = ['basic-struct', 'struct-whole-array', + 'struct-array-elem', 'array-struct', + 'array-struct-whole-array', + 'array-struct-array-elem', 'struct-struct', + 'array-struct-array-struct'] + for subtest in subtest_list: for mode in ['error', 'get', 'run', 'run-no-fs']: for options in possible_options: g(['ext_transform_feedback-structs{0}'.format(api_suffix), diff --git a/tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test b/tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test deleted file mode 100644 index 88b7a8d..0000000 --- a/tests/spec/glsl-es-3.00/execution/varying-struct-arrays.shader_test +++ /dev/null @@ -1,237 +0,0 @@ -# Test that varying structs work properly in conjunction with arrays. -# -# From the GLSL ES 3.00 specification, section 4.3.4 ("Input Variables"): -# -# Fragment inputs can only be signed and unsigned integers and -# integer vectors, float, floating-point vectors, matrices, or -# arrays or structures of these. -# -# And from section 4.3.6 ("Output Variables"): -# -# Vertex output variables ... can only be float, floating-point -# vectors, matrices, signed or unsigned integers or integer -# vectors, or arrays or structures of any these. -# -# This test verifies the proper functioning of varyings whose types -# are a struct containing an array, an array of structs, and various -# complex combinations of arrays and structs. -# -# Note: chapter 11 of the GLSL ES 3.00 spec ("Counting of Inputs and -# Outputs") specifies a packing algorithm which constitutes a minimum -# requirement for when a set of varyings must be supported by a -# conformant implementation. Although that chapter has not yet been -# updated to reflect varying structs, Khronos's internal bugzilla -# indicates that structs should be flattened before applying the -# packing algorithm -# (https://cvs.khronos.org/bugzilla/show_bug.cgi?id=9828). The -# varyings in this test flatten as follows: -# -# float s1.f; // A -# float[3] s1.af[]; // B -# float[3] as1[].f; // C -# float[9] as1[].af[]; // D -# float s2.s1.f; // E -# float[3] s2.s1.af[]; // F -# float[2] s2.as1[].f; // G -# float[6] s2.as1[].af[]; // H -# float[2] as2[].s1.f; // I -# float[6] as2[].s1.af[]; // J -# float[4] as2[].as1[].f; // K -# float[12] as2[].as1[].af[]; // L -# -# And the flattened varyings would in turn be packed like so: -# x y z w -# 0 L D J G -# 1 L D J G -# 2 L D J I -# 3 L D J I -# 4 L D J -# 5 L D J -# 6 L D B -# 7 L D B -# 8 L D B -# 9 L H C -# 10 L H C -# 11 L H C -# 12 K H F -# 13 K H F -# 14 K H F -# 15 K A E - -[require] -GL ES >= 3.0 -GLSL ES >= 3.00 - -[vertex shader] -#version 300 es - -uniform float ref; - -in vec4 vertex; -struct S1 -{ - float f; - float af[3]; -}; -struct S2 -{ - S1 s1; - S1 as1[2]; -}; -out S1 s1; -out S1 as1[3]; -out S2 s2; -out S2 as2[2]; - -void main() -{ - gl_Position = vertex; - float f = ref; - s1.f = f++; - s1.af[0] = f++; - s1.af[1] = f++; - s1.af[2] = f++; - as1[0].f = f++; - as1[0].af[0] = f++; - as1[0].af[1] = f++; - as1[0].af[2] = f++; - as1[1].f = f++; - as1[1].af[0] = f++; - as1[1].af[1] = f++; - as1[1].af[2] = f++; - as1[2].f = f++; - as1[2].af[0] = f++; - as1[2].af[1] = f++; - as1[2].af[2] = f++; - s2.s1.f = f++; - s2.s1.af[0] = f++; - s2.s1.af[1] = f++; - s2.s1.af[2] = f++; - s2.as1[0].f = f++; - s2.as1[0].af[0] = f++; - s2.as1[0].af[1] = f++; - s2.as1[0].af[2] = f++; - s2.as1[1].f = f++; - s2.as1[1].af[0] = f++; - s2.as1[1].af[1] = f++; - s2.as1[1].af[2] = f++; - as2[0].s1.f = f++; - as2[0].s1.af[0] = f++; - as2[0].s1.af[1] = f++; - as2[0].s1.af[2] = f++; - as2[0].as1[0].f = f++; - as2[0].as1[0].af[0] = f++; - as2[0].as1[0].af[1] = f++; - as2[0].as1[0].af[2] = f++; - as2[0].as1[1].f = f++; - as2[0].as1[1].af[0] = f++; - as2[0].as1[1].af[1] = f++; - as2[0].as1[1].af[2] = f++; - as2[1].s1.f = f++; - as2[1].s1.af[0] = f++; - as2[1].s1.af[1] = f++; - as2[1].s1.af[2] = f++; - as2[1].as1[0].f = f++; - as2[1].as1[0].af[0] = f++; - as2[1].as1[0].af[1] = f++; - as2[1].as1[0].af[2] = f++; - as2[1].as1[1].f = f++; - as2[1].as1[1].af[0] = f++; - as2[1].as1[1].af[1] = f++; - as2[1].as1[1].af[2] = f++; -} - -[fragment shader] -#version 300 es -precision highp float; - -uniform float ref; - -struct S1 -{ - float f; - float af[3]; -}; -struct S2 -{ - S1 s1; - S1 as1[2]; -}; -in S1 s1; -in S1 as1[3]; -in S2 s2; -in S2 as2[2]; -out vec4 color; - -#define CHECK(value, expected) \ - if (distance(value, expected) > 0.00001) \ - failed = true - -void main() -{ - bool failed = false; - float f = ref; - - CHECK(s1.f, f++); - CHECK(s1.af[0], f++); - CHECK(s1.af[1], f++); - CHECK(s1.af[2], f++); - CHECK(as1[0].f, f++); - CHECK(as1[0].af[0], f++); - CHECK(as1[0].af[1], f++); - CHECK(as1[0].af[2], f++); - CHECK(as1[1].f, f++); - CHECK(as1[1].af[0], f++); - CHECK(as1[1].af[1], f++); - CHECK(as1[1].af[2], f++); - CHECK(as1[2].f, f++); - CHECK(as1[2].af[0], f++); - CHECK(as1[2].af[1], f++); - CHECK(as1[2].af[2], f++); - CHECK(s2.s1.f, f++); - CHECK(s2.s1.af[0], f++); - CHECK(s2.s1.af[1], f++); - CHECK(s2.s1.af[2], f++); - CHECK(s2.as1[0].f, f++); - CHECK(s2.as1[0].af[0], f++); - CHECK(s2.as1[0].af[1], f++); - CHECK(s2.as1[0].af[2], f++); - CHECK(s2.as1[1].f, f++); - CHECK(s2.as1[1].af[0], f++); - CHECK(s2.as1[1].af[1], f++); - CHECK(s2.as1[1].af[2], f++); - CHECK(as2[0].s1.f, f++); - CHECK(as2[0].s1.af[0], f++); - CHECK(as2[0].s1.af[1], f++); - CHECK(as2[0].s1.af[2], f++); - CHECK(as2[0].as1[0].f, f++); - CHECK(as2[0].as1[0].af[0], f++); - CHECK(as2[0].as1[0].af[1], f++); - CHECK(as2[0].as1[0].af[2], f++); - CHECK(as2[0].as1[1].f, f++); - CHECK(as2[0].as1[1].af[0], f++); - CHECK(as2[0].as1[1].af[1], f++); - CHECK(as2[0].as1[1].af[2], f++); - CHECK(as2[1].s1.f, f++); - CHECK(as2[1].s1.af[0], f++); - CHECK(as2[1].s1.af[1], f++); - CHECK(as2[1].s1.af[2], f++); - CHECK(as2[1].as1[0].f, f++); - CHECK(as2[1].as1[0].af[0], f++); - CHECK(as2[1].as1[0].af[1], f++); - CHECK(as2[1].as1[0].af[2], f++); - CHECK(as2[1].as1[1].f, f++); - CHECK(as2[1].as1[1].af[0], f++); - CHECK(as2[1].as1[1].af[1], f++); - CHECK(as2[1].as1[1].af[2], f++); - - if (failed) - color = vec4(1.0, 0.0, 0.0, 1.0); - else - color = vec4(0.0, 1.0, 0.0, 1.0); -} - -[test] -uniform float ref 137.035999074 -draw rect -1 -1 2 2 -probe all rgba 0.0 1.0 0.0 1.0 -- 2.1.0 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
