[Piglit] [PATCH 2/2] arb_program_interface_query: correct rendez-vous by name matching

Andres Gomez agomez at igalia.com
Tue Mar 19 17:17:11 UTC 2019


On Tue, 2019-03-19 at 16:14 +0200, Andres Gomez wrote:
> On Sat, 2019-02-16 at 10:22 +1100, Timothy Arceri wrote:
> > It would be great if you could run this test on the Nvidia binary blob 
> > to confirm the results. If everything works as expected the series is:
> 
> The problem is that nVIDIA shows many other failures in these tests due
> to other conditions. However, the results do not change after this
> patch.
> 
> Additionally, I've tried to address all the other failures exhibited by
> nVIDIA in a series that I'll send shortly after.

See:
https://gitlab.freedesktop.org/mesa/piglit/merge_requests/20
https://gitlab.freedesktop.org/mesa/piglit/merge_requests/21

> In other words, the
> nVIDIA blob likes this changes. It just happens that it needs several
> additional other.
> 
> Hence, I'll understand I can land this series with your Rb.
> 
> 
> > Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
> > 
> > Thanks for fixing all this!
> > 
> > On 9/2/19 3:57 am, Andres Gomez wrote:
> > > Previuosly, this was overlooked asuming that, since they were SSOs, no
> > > inner interface matching check was needed.
> > > 
> > >  From the ARB_separate_shader_objects spec v.25:
> > > 
> > >    " With separable program objects, interfaces between shader stages
> > >      may involve the outputs from one program object and the inputs
> > >      from a second program object.  For such interfaces, it is not
> > >      possible to detect mismatches at link time, because the programs
> > >      are linked separately.  When each such program is linked, all
> > >      inputs or outputs interfacing with another program stage are
> > >      treated as active.  The linker will generate an executable that
> > >      assumes the presence of a compatible program on the other side of
> > >      the interface.  If a mismatch between programs occurs, no GL error
> > >      will be generated, but some or all of the inputs on the interface
> > >      will be undefined."
> > > 
> > > Cc: Timothy Arceri <tarceri at itsqueeze.com>
> > > Cc: Tapani Pälli <tapani.palli at intel.com>
> > > Cc: Ilia Mirkin <imirkin at alum.mit.edu>
> > > Cc: Martin Peres <martin.peres at linux.intel.com>
> > > Signed-off-by: Andres Gomez <agomez at igalia.com>
> > > ---
> > >   .../spec/arb_program_interface_query/common.h | 61 ++++++++++++++++---
> > >   .../getprogramresourceiv.c                    |  8 +--
> > >   .../resource-query.c                          | 48 +++++++--------
> > >   3 files changed, 79 insertions(+), 38 deletions(-)
> > > 
> > > diff --git a/tests/spec/arb_program_interface_query/common.h b/tests/spec/arb_program_interface_query/common.h
> > > index 371b0338b..c0a99ea64 100755
> > > --- a/tests/spec/arb_program_interface_query/common.h
> > > +++ b/tests/spec/arb_program_interface_query/common.h
> > > @@ -74,9 +74,11 @@ static const char vs_std[] =
> > >   	"uniform vs_struct sa[2];\n"
> > >   	"in vec4 vs_input0;\n"
> > >   	"in vec4 vs_input1;\n"
> > > +	"out vec4 vs_output1;\n"
> > >   	"void main() {\n"
> > >   	"	gl_Position = vs_input0 * vs_test * vs_input1 + sa[0].a[1] +"
> > >   	"	              sa[1].a[1];\n"
> > > +	"	vs_output1 = vs_input0;\n"
> > >   	"}";
> > >   
> > >   const char gs_std[] =
> > > @@ -86,18 +88,38 @@ const char gs_std[] =
> > >   	"uniform gs_uniform_block {\n"
> > >   	"	vec4 gs_test;\n"
> > >   	"};\n"
> > > -	"in vec4 gs_input[3];\n"
> > > -	"out vec4 gs_output0;\n"
> > > +	"in vec4 vs_output1[3];\n"
> > > +	"out vec4 fs_input1;\n"
> > >   	"void main() {\n"
> > >   	"	for (int i = 0; i < 6; i++) {\n"
> > > -	"		gl_Position = gs_input[i % 3] *"
> > > +	"		gl_Position = vs_output1[i % 3] *"
> > >   	"		              gl_in[i % 3].gl_Position * gs_test;\n"
> > > -	"		gs_output0 = gs_input[0];\n"
> > > +	"		fs_input1 = vs_output1[0];\n"
> > >   	"		EmitVertex();\n"
> > >   	"	}\n"
> > >   	"}\n";
> > >   
> > >   static const char fs_std[] =
> > > +	"#version 150\n"
> > > +	"uniform fs_uniform_block {"
> > > +	"	vec4 fs_color;\n"
> > > +	"	float fs_array[4];\n"
> > > +	"};\n"
> > > +	"uniform fs_array_uniform_block {\n"
> > > +	"	vec4 fs_color;\n"
> > > +	"	float fs_array[4];\n"
> > > +	"} faub[4];\n"
> > > +	"in vec4 vs_output1;\n"
> > > +	"out vec4 fs_output0;\n"
> > > +	"out vec4 fs_output1;\n"
> > > +	"void main() {\n"
> > > +		"fs_output0 = fs_color * vs_output1 * fs_array[2] * \n"
> > > +		"	      faub[0].fs_array[2] * faub[2].fs_array[2];\n"
> > > +		"fs_output1 = fs_color * vs_output1 * fs_array[3] * \n"
> > > +		"             faub[1].fs_array[3] * faub[3].fs_array[3];\n"
> > > +	"}";
> > > +
> > > +static const char fs_in[] =
> > >   	"#version 150\n"
> > >   	"uniform fs_uniform_block {"
> > >   	"	vec4 fs_color;\n"
> > > @@ -296,8 +318,8 @@ static const char tcs_sub[] =
> > >   	"uniform tcs_uniform_block {\n"
> > >   	"	vec4 tcs_test;\n"
> > >   	"};\n"
> > > -	"out vec4 tcs_output[3];\n"
> > > -	"in vec4 tcs_input[gl_MaxPatchVertices];\n"
> > > +	"out vec4 tes_input1[3];\n"
> > > +	"in vec4 vs_output1[gl_MaxPatchVertices];\n"
> > >   	"patch out vec4 tcs_patch;\n"
> > >   	"subroutine vec4 tcs_offset();\n"
> > >   	"subroutine uniform tcs_offset TESS_CONTROL;\n"
> > > @@ -306,7 +328,7 @@ static const char tcs_sub[] =
> > >   	"	gl_out[gl_InvocationID].gl_Position = tcs_test +"
> > >   	"	                                      gl_in[0].gl_Position *"
> > >   	"	                                      TESS_CONTROL();\n"
> > > -	"	tcs_output[gl_InvocationID] = tcs_input[0] + TESS_CONTROL();\n"
> > > +	"	tes_input1[gl_InvocationID] = vs_output1[0] + TESS_CONTROL();\n"
> > >   	"}";
> > >   
> > >   static const char tes_sub[] =
> > > @@ -317,15 +339,34 @@ static const char tes_sub[] =
> > >   	"uniform tes_uniform_block {\n"
> > >   	"	vec4 tes_test;\n"
> > >   	"};\n"
> > > -	"out vec4 tes_output[1];\n"
> > > -	"in vec4 tes_input[gl_MaxPatchVertices];\n"
> > > +	"out vec4 tes_output1;\n"
> > > +	"in vec4 vs_output1[gl_MaxPatchVertices];\n"
> > > +	"subroutine vec4 tes_offset();\n"
> > > +	"subroutine uniform tes_offset TESS_EVALUATION;\n"
> > > +	"subroutine (tes_offset) vec4 tess() { return vec4(1, 0, 0, 0); }\n"
> > > +	"void main() {\n"
> > > +	"	gl_Position = tes_test + gl_in[0].gl_Position +"
> > > +	"	              TESS_EVALUATION();\n"
> > > +	"	tes_output1 = vs_output1[0] + TESS_EVALUATION();\n"
> > > +	"}";
> > > +
> > > +static const char tes_in[] =
> > > +	"#version 150\n"
> > > +	"#extension GL_ARB_shader_subroutine : require\n"
> > > +	"#extension GL_ARB_tessellation_shader : require\n"
> > > +	"layout(triangles) in;\n"
> > > +	"uniform tes_uniform_block {\n"
> > > +	"	vec4 tes_test;\n"
> > > +	"};\n"
> > > +	"out vec4 vs_output1;\n"
> > > +	"in vec4 tes_input1[gl_MaxPatchVertices];\n"
> > >   	"subroutine vec4 tes_offset();\n"
> > >   	"subroutine uniform tes_offset TESS_EVALUATION;\n"
> > >   	"subroutine (tes_offset) vec4 tess() { return vec4(1, 0, 0, 0); }\n"
> > >   	"void main() {\n"
> > >   	"	gl_Position = tes_test + gl_in[0].gl_Position +"
> > >   	"	              TESS_EVALUATION();\n"
> > > -	"	tes_output[0] = tes_input[0] + TESS_EVALUATION();\n"
> > > +	"	vs_output1 = tes_input1[0] + TESS_EVALUATION();\n"
> > >   	"}";
> > >   
> > >   static const char cs_sub[] =
> > > diff --git a/tests/spec/arb_program_interface_query/getprogramresourceiv.c b/tests/spec/arb_program_interface_query/getprogramresourceiv.c
> > > index 70212350e..e55cf96ac 100755
> > > --- a/tests/spec/arb_program_interface_query/getprogramresourceiv.c
> > > +++ b/tests/spec/arb_program_interface_query/getprogramresourceiv.c
> > > @@ -567,8 +567,8 @@ static const struct subtest_t subtests[] = {
> > >   	{ GL_REFERENCED_BY_COMPUTE_SHADER, 1, { 0 } },
> > >   	{ 0, 0, { 0 } }}
> > >    },
> > > - { &prog_std, GL_TRANSFORM_FEEDBACK_VARYING, "gs_output0", NULL, {
> > > -	{ GL_NAME_LENGTH, 1, { 11 } },
> > > + { &prog_std, GL_TRANSFORM_FEEDBACK_VARYING, "fs_input1", NULL, {
> > > +	{ GL_NAME_LENGTH, 1, { 10 } },
> > >   	{ GL_ARRAY_SIZE, 1, { 1 } },
> > >   	{ 0, 0, { 0 } }}
> > >    },
> > > @@ -1012,7 +1012,7 @@ report_result:
> > >   void
> > >   piglit_init(int argc, char **argv)
> > >   {
> > > -	static const char *st_r_tf_varying[] = {"gs_output0", NULL};
> > > +	static const char *st_r_tf_varying[] = {"fs_input1", NULL};
> > >   
> > >   	piglit_require_extension("GL_ARB_program_interface_query");
> > >   	piglit_require_extension("GL_ARB_separate_shader_objects");
> > > @@ -1021,7 +1021,7 @@ piglit_init(int argc, char **argv)
> > >   	prog_std = piglit_build_simple_program_unlinked_multiple_shaders(
> > >   					GL_VERTEX_SHADER, vs_std,
> > >   					GL_GEOMETRY_SHADER, gs_std,
> > > -					GL_FRAGMENT_SHADER, fs_std,
> > > +					GL_FRAGMENT_SHADER, fs_in,
> > >   					0);
> > >   	glTransformFeedbackVaryings(prog_std, 1, st_r_tf_varying,
> > >   				    GL_INTERLEAVED_ATTRIBS);
> > > diff --git a/tests/spec/arb_program_interface_query/resource-query.c b/tests/spec/arb_program_interface_query/resource-query.c
> > > index bf60dde93..f47431a30 100755
> > > --- a/tests/spec/arb_program_interface_query/resource-query.c
> > > +++ b/tests/spec/arb_program_interface_query/resource-query.c
> > > @@ -209,25 +209,25 @@ static const char *st_r_tess_uniform_block[] = {"tcs_uniform_block",
> > >   						"tes_uniform_block", NULL};
> > >   static const char *st_r_cs_uniform_block[] = {"cs_uniform_block", NULL};
> > >   static const char *st_r_in_vs[] = {"vs_input0", "vs_input1", NULL};
> > > -static const char *st_r_in_gs[] = {"gs_input[0]", "gl_PerVertex.gl_Position", NULL};
> > > +static const char *st_r_in_gs[] = {"vs_output1[0]", "gl_PerVertex.gl_Position", NULL};
> > >   static const char *st_r_in_fs[] = {"fs_input1", NULL};
> > > -static const char *st_r_in_tes[] = {"tes_input[0]", "gl_PerVertex.gl_Position", NULL};
> > > -static const char *st_r_in_tcs[] = {"tcs_input[0]",
> > > +static const char *st_r_in_tes[] = {"tes_input1[0]", "gl_PerVertex.gl_Position", NULL};
> > > +static const char *st_r_in_tcs[] = {"vs_output1[0]",
> > >   				    "gl_InvocationID",
> > >   				    "gl_PerVertex.gl_Position",
> > >   				    NULL};
> > > -static const char *st_r_out_vs[] = {"gl_Position", NULL};
> > > -static const char *st_r_out_gs[] = {"gs_output0", "gl_Position", NULL};
> > > +static const char *st_r_out_vs[] = {"vs_output1", "gl_Position", NULL};
> > > +static const char *st_r_out_gs[] = {"fs_input1", "gl_Position", NULL};
> > >   static const char *st_r_out_fs[] = {"fs_output0", "fs_output1", NULL};
> > > -static const char *st_r_out_tes[] = {"tes_output[0]", "gl_Position", NULL};
> > > -static const char *st_r_out_tcs[] = {"tcs_output[0]", "tcs_patch",
> > > +static const char *st_r_out_tes[] = {"vs_output1", "gl_Position", NULL};
> > > +static const char *st_r_out_tcs[] = {"tes_input1[0]", "tcs_patch",
> > >   				     "gl_PerVertex.gl_Position",
> > >   				     NULL};
> > >   static const char *st_r_buffer[] = {"vs_buf_var", "gs_buf_var", "fs_buf_var",
> > >   				    NULL};
> > >   static const char *st_r_stor_block[] = {"vs_buffer_block", "gs_buffer_block",
> > >   					"fs_buffer_block", NULL};
> > > -static const char *st_r_tf_varying[] = {"gl_Position", "gs_output0", NULL};
> > > +static const char *st_r_tf_varying[] = {"gl_Position", "fs_input1", NULL};
> > >   static const char *st_r_vs_sub[] = {"vss", "vss2", NULL};
> > >   static const char *st_r_gs_sub[] = {"gss", NULL};
> > >   static const char *st_r_fs_sub[] = {"fss", NULL};
> > > @@ -353,35 +353,35 @@ struct subtest_t {
> > >   }
> > >   
> > >   static const struct subtest_t subtests[] = {
> > > - ST( 8, 35, -1, -1,  vs_std,    NULL,    NULL,  gs_std,  fs_std,   NULL, GL_UNIFORM, "(vs,gs,fs)", st_r_uniform),
> > > - ST( 2,  9, -1, -1,    NULL, tcs_sub, tes_sub,    NULL,    NULL,   NULL, GL_UNIFORM, "(tes,tcs)", st_r_tess_uniform),
> > > + ST( 8, 35, -1, -1,  vs_std,    NULL,    NULL,  gs_std,   fs_in,   NULL, GL_UNIFORM, "(vs,gs,fs)", st_r_uniform),
> > > + ST( 2,  9, -1, -1,    NULL, tcs_sub,  tes_in,    NULL,    NULL,   NULL, GL_UNIFORM, "(tes,tcs)", st_r_tess_uniform),
> > >    ST( 2,  8, -1, -1,    NULL,    NULL,    NULL,    NULL,    NULL, cs_sub, GL_UNIFORM, "(cs)", st_r_cs_uniform),
> > > - ST( 7, 26,  2, -1,  vs_std,    NULL,    NULL,  gs_std,  fs_std,   NULL, GL_UNIFORM_BLOCK, "(vs,gs,fs)", st_r_uniform_block),
> > > - ST( 2, 18, -1, -1,    NULL, tcs_sub, tes_sub,    NULL,    NULL,   NULL, GL_UNIFORM_BLOCK, "(tcs,tes)", st_r_tess_uniform_block),
> > > + ST( 7, 26,  2, -1,  vs_std,    NULL,    NULL,  gs_std,   fs_in,   NULL, GL_UNIFORM_BLOCK, "(vs,gs,fs)", st_r_uniform_block),
> > > + ST( 2, 18, -1, -1,    NULL, tcs_sub,  tes_in,    NULL,    NULL,   NULL, GL_UNIFORM_BLOCK, "(tcs,tes)", st_r_tess_uniform_block),
> > >    ST( 1, 17, -1, -1,    NULL,    NULL,    NULL,    NULL,    NULL, cs_sub, GL_UNIFORM_BLOCK, "(cs)", st_r_cs_uniform_block),
> > >    ST( 2, 10, -1, -1,  vs_std,    NULL,    NULL,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(vs)", st_r_in_vs),
> > >    ST( 2, 25, -1, -1,    NULL,    NULL,    NULL,  gs_std,    NULL,   NULL, GL_PROGRAM_INPUT, "(gs)", st_r_in_gs),
> > > - ST( 1, 10, -1, -1,    NULL,    NULL,    NULL,    NULL,  fs_std,   NULL, GL_PROGRAM_INPUT, "(fs)", st_r_in_fs),
> > > + ST( 1, 10, -1, -1,    NULL,    NULL,    NULL,    NULL,   fs_in,   NULL, GL_PROGRAM_INPUT, "(fs)", st_r_in_fs),
> > >    ST( 2, 10, -1, -1,  vs_std,    NULL,    NULL,    NULL,  fs_std,   NULL, GL_PROGRAM_INPUT, "(vs,fs)", st_r_in_vs),
> > >    ST( 2, 10, -1, -1,  vs_std,    NULL,    NULL,  gs_std,    NULL,   NULL, GL_PROGRAM_INPUT, "(vs,gs)", st_r_in_vs),
> > > - ST( 2, 25, -1, -1,    NULL,    NULL,    NULL,  gs_std,  fs_std,   NULL, GL_PROGRAM_INPUT, "(gs,fs)", st_r_in_gs),
> > > - ST( 2, 10, -1, -1,  vs_std,    NULL,    NULL,  gs_std,  fs_std,   NULL, GL_PROGRAM_INPUT, "(vs,gs,fs)", st_r_in_vs),
> > > - ST( 2, 25, -1, -1,    NULL,    NULL, tes_sub,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(tes)", st_r_in_tes),
> > > + ST( 2, 25, -1, -1,    NULL,    NULL,    NULL,  gs_std,   fs_in,   NULL, GL_PROGRAM_INPUT, "(gs,fs)", st_r_in_gs),
> > > + ST( 2, 10, -1, -1,  vs_std,    NULL,    NULL,  gs_std,   fs_in,   NULL, GL_PROGRAM_INPUT, "(vs,gs,fs)", st_r_in_vs),
> > > + ST( 2, 25, -1, -1,    NULL,    NULL,  tes_in,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(tes)", st_r_in_tes),
> > >    ST( 3, 25, -1, -1,    NULL, tcs_sub,    NULL,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(tcs)", st_r_in_tcs),
> > > - ST( 3, 25, -1, -1,    NULL, tcs_sub, tes_sub,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(tcs,tes)", st_r_in_tcs),
> > > - ST( 2, 10, -1, -1,  vs_std, tcs_sub, tes_sub,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(vs,tcs,tes)", st_r_in_vs),
> > > + ST( 3, 25, -1, -1,    NULL, tcs_sub,  tes_in,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(tcs,tes)", st_r_in_tcs),
> > > + ST( 2, 10, -1, -1,  vs_std, tcs_sub,  tes_in,    NULL,    NULL,   NULL, GL_PROGRAM_INPUT, "(vs,tcs,tes)", st_r_in_vs),
> > >    ST( 0,  0, -1, -1,    NULL,    NULL,    NULL,    NULL,    NULL, cs_sub, GL_PROGRAM_INPUT, "(cs)", NULL),
> > > - ST( 1, 12, -1, -1,  vs_std,    NULL,    NULL,    NULL,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(vs)", st_r_out_vs),
> > > + ST( 2, 12, -1, -1,  vs_std,    NULL,    NULL,    NULL,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(vs)", st_r_out_vs),
> > >    ST( 2, 12, -1, -1,    NULL,    NULL,    NULL,  gs_std,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(gs)", st_r_out_gs),
> > >    ST( 2, 11, -1, -1,    NULL,    NULL,    NULL,    NULL,  fs_std,   NULL, GL_PROGRAM_OUTPUT, "(fs)", st_r_out_fs),
> > >    ST( 2, 11, -1, -1,  vs_std,    NULL,    NULL,    NULL,  fs_std,   NULL, GL_PROGRAM_OUTPUT, "(vs,fs)", st_r_out_fs),
> > >    ST( 2, 12, -1, -1,  vs_std,    NULL,    NULL,  gs_std,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(vs,gs)", st_r_out_gs),
> > > - ST( 2, 11, -1, -1,    NULL,    NULL,    NULL,  gs_std,  fs_std,   NULL, GL_PROGRAM_OUTPUT, "(gs,fs)", st_r_out_fs),
> > > - ST( 2, 11, -1, -1,  vs_std,    NULL,    NULL,  gs_std,  fs_std,   NULL, GL_PROGRAM_OUTPUT, "(vs,gs,fs)", st_r_out_fs),
> > > - ST( 2, 14, -1, -1,    NULL,    NULL, tes_sub,    NULL,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(tes)", st_r_out_tes),
> > > + ST( 2, 11, -1, -1,    NULL,    NULL,    NULL,  gs_std,   fs_in,   NULL, GL_PROGRAM_OUTPUT, "(gs,fs)", st_r_out_fs),
> > > + ST( 2, 11, -1, -1,  vs_std,    NULL,    NULL,  gs_std,   fs_in,   NULL, GL_PROGRAM_OUTPUT, "(vs,gs,fs)", st_r_out_fs),
> > > + ST( 2, 12, -1, -1,    NULL,    NULL,  tes_in,    NULL,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(tes)", st_r_out_tes),
> > >    ST( 3, 25, -1, -1,    NULL, tcs_sub,    NULL,    NULL,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(tcs)", st_r_out_tcs),
> > > - ST( 2, 14, -1, -1,    NULL, tcs_sub, tes_sub,    NULL,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(tcs,tes)", st_r_out_tes),
> > > - ST( 2, 12, -1, -1,    NULL, tcs_sub, tes_sub,  gs_std,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(tcs,tes,gs)", st_r_out_gs),
> > > + ST( 2, 12, -1, -1,    NULL, tcs_sub,  tes_in,    NULL,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(tcs,tes)", st_r_out_tes),
> > > + ST( 2, 12, -1, -1,    NULL, tcs_sub,  tes_in,  gs_std,    NULL,   NULL, GL_PROGRAM_OUTPUT, "(tcs,tes,gs)", st_r_out_gs),
> > >    ST( 0,  0, -1, -1,    NULL,    NULL,    NULL,    NULL,    NULL, cs_sub, GL_PROGRAM_OUTPUT, "(cs)", st_r_cs_sub),
> > >    ST( 3, 11, -1, -1, vs_stor,    NULL,    NULL, gs_stor, fs_stor,   NULL, GL_BUFFER_VARIABLE, "", st_r_buffer),
> > >    ST( 3, 16,  1, -1, vs_stor,    NULL,    NULL, gs_stor, fs_stor,   NULL, GL_SHADER_STORAGE_BLOCK, "", st_r_stor_block),
> > > 
-- 
Br,

Andres



More information about the Piglit mailing list