[31/35] arb_gpu_shader5: Add support for testing spirv with XFB streams

Submitted by apinheiro on Aug. 9, 2018, 11:36 a.m.

Details

Message ID 20180809113614.5122-32-apinheiro@igalia.com
State New
Headers show
Series "ARB_gl_spirv: all tests so far" ( rev: 1 ) in Piglit

Not browsing as part of any series.

Commit Message

apinheiro Aug. 9, 2018, 11:36 a.m.
From: Neil Roberts <nroberts@igalia.com>

v2: use shader_test file with the spirv assembly, instead of include
    two SPIRV binaries (Alejandro Piñeiro)

Signed-off-by: Neil Roberts <nroberts@igalia.com>
Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
---
 tests/opengl.py                                    |   1 +
 .../xfb_streams_without_invocations.shader_test    | 197 +++++++++++++++++++++
 .../execution/xfb-streams-without-invocations.c    | 135 ++++++++++----
 3 files changed, 300 insertions(+), 33 deletions(-)
 create mode 100644 tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test

Patch hide | download patch | download mbox

diff --git a/tests/opengl.py b/tests/opengl.py
index 064c43e08..9b1e09564 100644
--- a/tests/opengl.py
+++ b/tests/opengl.py
@@ -1969,6 +1969,7 @@  with profile.test_list.group_manager(
     g(['arb_gpu_shader5-emitstreamvertex_stream_too_large'])
     g(['arb_gpu_shader5-tf-wrong-stream-value'])
     g(['arb_gpu_shader5-xfb-streams-without-invocations'])
+    g(['arb_gpu_shader5-xfb-streams-without-invocations', 'spirv'])
     g(['arb_gpu_shader5-emitstreamvertex_nodraw'])
     g(['arb_gpu_shader5-interpolateAtCentroid'])
     g(['arb_gpu_shader5-interpolateAtCentroid-packing'])
diff --git a/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
new file mode 100644
index 000000000..6611e0bf8
--- /dev/null
+++ b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
@@ -0,0 +1,197 @@ 
+[require]
+GLSL >= 4.50
+
+[vertex shader spirv]
+; Automatically generated from the GLSL by shader_test_spirv.py. DO NOT EDIT
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %gl_VertexID %gl_InstanceID
+               OpSource GLSL 450
+               OpName %_ ""
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_VertexID BuiltIn VertexId
+               OpDecorate %gl_InstanceID BuiltIn InstanceId
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+    %float_0 = OpConstant %float 0
+         %17 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Input_int = OpTypePointer Input %int
+%gl_VertexID = OpVariable %_ptr_Input_int Input
+%gl_InstanceID = OpVariable %_ptr_Input_int Input
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %19 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %19 %17
+               OpReturn
+               OpFunctionEnd
+
+[vertex shader]
+#version 450
+
+void main() {
+     gl_Position = vec4(0.0);
+}
+
+
+[geometry shader spirv]
+; Automatically generated from the GLSL by shader_test_spirv.py. DO NOT EDIT
+; SPIR-V
+; Version: 1.0
+; Generator: Khronos Glslang Reference Front End; 7
+; Bound: 41
+; Schema: 0
+               OpCapability Geometry
+               OpCapability TransformFeedback
+               OpCapability GeometryStreams
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Geometry %main "main" %_ %gl_in %stream0_0_out %stream2_0_out %stream2_1_out %stream1_0_out
+               OpExecutionMode %main Xfb
+               OpExecutionMode %main InputPoints
+               OpExecutionMode %main Invocations 1
+               OpExecutionMode %main OutputPoints
+               OpExecutionMode %main OutputVertices 3
+               OpSource GLSL 450
+               OpName %_ ""
+               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex Block
+               OpDecorate %gl_PerVertex Stream 0
+               OpDecorate %_ Stream 0
+               OpDecorate %_ XfbBuffer 0
+               OpDecorate %_ XfbStride 4
+               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
+               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
+               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
+               OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
+               OpDecorate %gl_PerVertex_0 Block
+               OpDecorate %stream0_0_out Location 0
+               OpDecorate %stream0_0_out Stream 0
+               OpDecorate %stream0_0_out XfbBuffer 0
+               OpDecorate %stream0_0_out XfbStride 4
+               OpDecorate %stream0_0_out Offset 0
+               OpDecorate %stream2_0_out Location 2
+               OpDecorate %stream2_0_out Stream 2
+               OpDecorate %stream2_0_out XfbBuffer 2
+               OpDecorate %stream2_0_out XfbStride 20
+               OpDecorate %stream2_0_out Offset 0
+               OpDecorate %stream2_1_out Location 3
+               OpDecorate %stream2_1_out Stream 2
+               OpDecorate %stream2_1_out XfbBuffer 2
+               OpDecorate %stream2_1_out XfbStride 20
+               OpDecorate %stream2_1_out Offset 4
+               OpDecorate %stream1_0_out Location 1
+               OpDecorate %stream1_0_out Stream 1
+               OpDecorate %stream1_0_out XfbBuffer 1
+               OpDecorate %stream1_0_out XfbStride 8
+               OpDecorate %stream1_0_out Offset 0
+       %void = OpTypeVoid
+          %3 = OpTypeFunction %void
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+       %uint = OpTypeInt 32 0
+     %uint_1 = OpConstant %uint 1
+%_arr_float_uint_1 = OpTypeArray %float %uint_1
+%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
+          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
+        %int = OpTypeInt 32 1
+      %int_0 = OpConstant %int 0
+%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
+%_arr_gl_PerVertex_0_uint_1 = OpTypeArray %gl_PerVertex_0 %uint_1
+%_ptr_Input__arr_gl_PerVertex_0_uint_1 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_1
+      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_1 Input
+%_ptr_Input_v4float = OpTypePointer Input %v4float
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+%_ptr_Output_float = OpTypePointer Output %float
+%stream0_0_out = OpVariable %_ptr_Output_float Output
+    %float_0 = OpConstant %float 0
+%stream2_0_out = OpVariable %_ptr_Output_float Output
+%stream2_1_out = OpVariable %_ptr_Output_v4float Output
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+    %float_4 = OpConstant %float 4
+         %34 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
+      %int_2 = OpConstant %int 2
+    %v2float = OpTypeVector %float 2
+%_ptr_Output_v2float = OpTypePointer Output %v2float
+%stream1_0_out = OpVariable %_ptr_Output_v2float Output
+         %39 = OpConstantComposite %v2float %float_0 %float_1
+      %int_1 = OpConstant %int 1
+       %main = OpFunction %void None %3
+          %5 = OpLabel
+         %21 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
+         %22 = OpLoad %v4float %21
+         %24 = OpAccessChain %_ptr_Output_v4float %_ %int_0
+               OpStore %24 %22
+               OpStore %stream0_0_out %float_0
+               OpEmitStreamVertex %int_0
+               OpEndStreamPrimitive %int_0
+               OpStore %stream2_0_out %float_0
+               OpStore %stream2_1_out %34
+               OpEmitStreamVertex %int_2
+               OpEndStreamPrimitive %int_2
+               OpStore %stream1_0_out %39
+               OpEmitStreamVertex %int_1
+               OpEndStreamPrimitive %int_1
+               OpReturn
+               OpFunctionEnd
+
+[geometry shader]
+#version 450
+
+layout(points) in;
+layout(points, max_vertices = 3) out;
+
+layout(xfb_buffer = 0, xfb_stride = 4) out;
+layout(xfb_buffer = 1, xfb_stride = 8) out;
+layout(xfb_buffer = 2, xfb_stride = 20) out;
+
+layout(stream = 0, location = 0, xfb_buffer = 0, xfb_offset = 0)
+out float stream0_0_out;
+layout(stream = 1, location = 1, xfb_buffer = 1, xfb_offset = 0)
+out vec2 stream1_0_out;
+layout(stream = 2, location = 2, xfb_buffer = 2, xfb_offset = 0)
+out float stream2_0_out;
+layout(stream = 2, location = 3, xfb_buffer = 2, xfb_offset = 4)
+out vec4 stream2_1_out;
+
+void main() {
+  gl_Position = gl_in[0].gl_Position;
+  stream0_0_out = 0.0;
+  EmitStreamVertex(0);
+  EndStreamPrimitive(0);
+
+  stream2_0_out = 0.0;
+  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);
+  EmitStreamVertex(2);
+  EndStreamPrimitive(2);
+
+  stream1_0_out = vec2(0.0, 1.0);
+  EmitStreamVertex(1);
+  EndStreamPrimitive(1);
+}
diff --git a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
index 37ca7a141..50f8b101a 100644
--- a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
+++ b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
@@ -22,6 +22,7 @@ 
  */
 
 #include "piglit-util-gl.h"
+#include "piglit-shader-test.h"
 
 /**
  * @file xfb-streams-without-invocations.c
@@ -41,51 +42,84 @@  PIGLIT_GL_TEST_CONFIG_BEGIN
 
 PIGLIT_GL_TEST_CONFIG_END
 
-static const char vs_pass_thru_text[] =
-	"#version 150\n"
-	"void main() {\n"
-	"  gl_Position = vec4(0.0);\n"
-	"}\n";
-
-static const char gs_text[] =
-	"#version 150\n"
-	"#extension GL_ARB_gpu_shader5 : enable\n"
-	"layout(points) in;\n"
-	"layout(points, max_vertices = 3) out;\n"
-	"layout(stream = 0) out float stream0_0_out;\n"
-	"layout(stream = 1) out vec2 stream1_0_out;\n"
-	"layout(stream = 2) out float stream2_0_out;\n"
-	"layout(stream = 2) out vec4 stream2_1_out;\n"
-	"void main() {\n"
-	"  gl_Position = gl_in[0].gl_Position;\n"
-	"  stream0_0_out = 0.0;\n"
-	"  EmitStreamVertex(0);\n"
-	"  EndStreamPrimitive(0);\n"
-
-	"  stream2_0_out = 0.0;\n"
-	"  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);\n"
-	"  EmitStreamVertex(2);\n"
-	"  EndStreamPrimitive(2);\n"
-
-	"  stream1_0_out = vec2(0.0, 1.0);\n"
-	"  EmitStreamVertex(1);\n"
-	"  EndStreamPrimitive(1);\n"
-	"}";
-
 int stream_float_counts[] = { 1, 2, 5, 0 };
+static bool use_spirv = false;
 
 #define STREAMS 4
 
+#define SHADER_TEST_FILE_NAME "xfb_streams_without_invocations.shader_test"
+char shader_test_filename[4096];
+
 static const char *varyings[] = {
 	"stream0_0_out", "gl_NextBuffer",
 	"stream1_0_out", "gl_NextBuffer",
 	"stream2_0_out", "stream2_1_out"
 };
 
-static void
-build_and_use_program()
+
+static GLuint
+assemble_spirv_shader(GLenum shader_type)
+{
+	char *shader_asm;
+	unsigned shader_asm_size;
+	GLuint shader;
+
+	if (!piglit_load_source_from_shader_test(shader_test_filename,
+						 shader_type, true,
+						 &shader_asm, &shader_asm_size)) {
+		piglit_report_result(PIGLIT_FAIL);
+	}
+
+	shader = piglit_assemble_spirv(shader_type,
+				       shader_asm_size,
+				       shader_asm);
+	free(shader_asm);
+
+	glSpecializeShader(shader,
+			   "main",
+			   0, /* numSpecializationConstants */
+			   NULL /* pConstantIndex */,
+			   NULL /* pConstantValue */);
+
+	return shader;
+}
+
+static GLuint
+build_spirv_program(void)
+{
+	GLuint prog, shader;
+
+	prog = glCreateProgram();
+
+	shader = assemble_spirv_shader(GL_VERTEX_SHADER);
+	glAttachShader(prog, shader);
+	glDeleteShader(shader);
+
+	shader = assemble_spirv_shader(GL_GEOMETRY_SHADER);
+	glAttachShader(prog, shader);
+	glDeleteShader(shader);
+
+	return prog;
+}
+
+static GLuint
+build_glsl_program()
 {
 	GLuint prog;
+	char *gs_text;
+	char *vs_pass_thru_text;
+
+	if (!piglit_load_source_from_shader_test(shader_test_filename,
+						 GL_GEOMETRY_SHADER, false,
+						 &gs_text, NULL))
+		return 0;
+
+
+	if (!piglit_load_source_from_shader_test(shader_test_filename,
+						 GL_VERTEX_SHADER, false,
+						 &vs_pass_thru_text, NULL))
+		return 0;
+
 
 	prog = piglit_build_simple_program_multiple_shaders(
 			GL_VERTEX_SHADER, vs_pass_thru_text,
@@ -94,6 +128,22 @@  build_and_use_program()
 	glTransformFeedbackVaryings(prog, ARRAY_SIZE(varyings), varyings,
 			GL_INTERLEAVED_ATTRIBS);
 
+	free(gs_text);
+	free(vs_pass_thru_text);
+
+	return prog;
+}
+
+static void
+build_and_use_program()
+{
+	GLuint prog;
+
+	if (use_spirv)
+		prog = build_spirv_program();
+	else
+		prog = build_glsl_program();
+
 	glLinkProgram(prog);
 	if (!piglit_link_check_status(prog))
 		piglit_report_result(PIGLIT_FAIL);
@@ -193,6 +243,25 @@  piglit_init(int argc, char **argv)
 	piglit_require_extension("GL_ARB_gpu_shader5");
 	piglit_require_extension("GL_ARB_transform_feedback3");
 
+	for (i = 1; i < argc; i++) {
+		if (!strcmp(argv[i], "spirv"))
+			use_spirv = true;
+	}
+
+	if (use_spirv)
+		piglit_require_extension("GL_ARB_gl_spirv");
+
+	piglit_join_paths(shader_test_filename,
+			  sizeof(shader_test_filename),
+			  7, /* num parts */
+			  piglit_source_dir(),
+			  "tests",
+			  "spec",
+			  "arb_gpu_shader5",
+			  "execution",
+			  "shader_test",
+			  SHADER_TEST_FILE_NAME);
+
 	build_and_use_program();
 
 	/* Set up the transform feedback buffers. */

Comments

Won't this cause shader runner to needlessly parse the .shader_test file?

On 09/08/18 21:36, Alejandro Piñeiro wrote:
> From: Neil Roberts <nroberts@igalia.com>
> 
> v2: use shader_test file with the spirv assembly, instead of include
>      two SPIRV binaries (Alejandro Piñeiro)
> 
> Signed-off-by: Neil Roberts <nroberts@igalia.com>
> Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
> ---
>   tests/opengl.py                                    |   1 +
>   .../xfb_streams_without_invocations.shader_test    | 197 +++++++++++++++++++++
>   .../execution/xfb-streams-without-invocations.c    | 135 ++++++++++----
>   3 files changed, 300 insertions(+), 33 deletions(-)
>   create mode 100644 tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
> 
> diff --git a/tests/opengl.py b/tests/opengl.py
> index 064c43e08..9b1e09564 100644
> --- a/tests/opengl.py
> +++ b/tests/opengl.py
> @@ -1969,6 +1969,7 @@ with profile.test_list.group_manager(
>       g(['arb_gpu_shader5-emitstreamvertex_stream_too_large'])
>       g(['arb_gpu_shader5-tf-wrong-stream-value'])
>       g(['arb_gpu_shader5-xfb-streams-without-invocations'])
> +    g(['arb_gpu_shader5-xfb-streams-without-invocations', 'spirv'])
>       g(['arb_gpu_shader5-emitstreamvertex_nodraw'])
>       g(['arb_gpu_shader5-interpolateAtCentroid'])
>       g(['arb_gpu_shader5-interpolateAtCentroid-packing'])
> diff --git a/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
> new file mode 100644
> index 000000000..6611e0bf8
> --- /dev/null
> +++ b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
> @@ -0,0 +1,197 @@
> +[require]
> +GLSL >= 4.50
> +
> +[vertex shader spirv]
> +; Automatically generated from the GLSL by shader_test_spirv.py. DO NOT EDIT
> +; SPIR-V
> +; Version: 1.0
> +; Generator: Khronos Glslang Reference Front End; 7
> +; Bound: 23
> +; Schema: 0
> +               OpCapability Shader
> +          %1 = OpExtInstImport "GLSL.std.450"
> +               OpMemoryModel Logical GLSL450
> +               OpEntryPoint Vertex %main "main" %_ %gl_VertexID %gl_InstanceID
> +               OpSource GLSL 450
> +               OpName %_ ""
> +               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
> +               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
> +               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
> +               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
> +               OpDecorate %gl_PerVertex Block
> +               OpDecorate %gl_VertexID BuiltIn VertexId
> +               OpDecorate %gl_InstanceID BuiltIn InstanceId
> +       %void = OpTypeVoid
> +          %3 = OpTypeFunction %void
> +      %float = OpTypeFloat 32
> +    %v4float = OpTypeVector %float 4
> +       %uint = OpTypeInt 32 0
> +     %uint_1 = OpConstant %uint 1
> +%_arr_float_uint_1 = OpTypeArray %float %uint_1
> +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
> +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
> +          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
> +        %int = OpTypeInt 32 1
> +      %int_0 = OpConstant %int 0
> +    %float_0 = OpConstant %float 0
> +         %17 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
> +%_ptr_Output_v4float = OpTypePointer Output %v4float
> +%_ptr_Input_int = OpTypePointer Input %int
> +%gl_VertexID = OpVariable %_ptr_Input_int Input
> +%gl_InstanceID = OpVariable %_ptr_Input_int Input
> +       %main = OpFunction %void None %3
> +          %5 = OpLabel
> +         %19 = OpAccessChain %_ptr_Output_v4float %_ %int_0
> +               OpStore %19 %17
> +               OpReturn
> +               OpFunctionEnd
> +
> +[vertex shader]
> +#version 450
> +
> +void main() {
> +     gl_Position = vec4(0.0);
> +}
> +
> +
> +[geometry shader spirv]
> +; Automatically generated from the GLSL by shader_test_spirv.py. DO NOT EDIT
> +; SPIR-V
> +; Version: 1.0
> +; Generator: Khronos Glslang Reference Front End; 7
> +; Bound: 41
> +; Schema: 0
> +               OpCapability Geometry
> +               OpCapability TransformFeedback
> +               OpCapability GeometryStreams
> +          %1 = OpExtInstImport "GLSL.std.450"
> +               OpMemoryModel Logical GLSL450
> +               OpEntryPoint Geometry %main "main" %_ %gl_in %stream0_0_out %stream2_0_out %stream2_1_out %stream1_0_out
> +               OpExecutionMode %main Xfb
> +               OpExecutionMode %main InputPoints
> +               OpExecutionMode %main Invocations 1
> +               OpExecutionMode %main OutputPoints
> +               OpExecutionMode %main OutputVertices 3
> +               OpSource GLSL 450
> +               OpName %_ ""
> +               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
> +               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
> +               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
> +               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
> +               OpDecorate %gl_PerVertex Block
> +               OpDecorate %gl_PerVertex Stream 0
> +               OpDecorate %_ Stream 0
> +               OpDecorate %_ XfbBuffer 0
> +               OpDecorate %_ XfbStride 4
> +               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
> +               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
> +               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
> +               OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
> +               OpDecorate %gl_PerVertex_0 Block
> +               OpDecorate %stream0_0_out Location 0
> +               OpDecorate %stream0_0_out Stream 0
> +               OpDecorate %stream0_0_out XfbBuffer 0
> +               OpDecorate %stream0_0_out XfbStride 4
> +               OpDecorate %stream0_0_out Offset 0
> +               OpDecorate %stream2_0_out Location 2
> +               OpDecorate %stream2_0_out Stream 2
> +               OpDecorate %stream2_0_out XfbBuffer 2
> +               OpDecorate %stream2_0_out XfbStride 20
> +               OpDecorate %stream2_0_out Offset 0
> +               OpDecorate %stream2_1_out Location 3
> +               OpDecorate %stream2_1_out Stream 2
> +               OpDecorate %stream2_1_out XfbBuffer 2
> +               OpDecorate %stream2_1_out XfbStride 20
> +               OpDecorate %stream2_1_out Offset 4
> +               OpDecorate %stream1_0_out Location 1
> +               OpDecorate %stream1_0_out Stream 1
> +               OpDecorate %stream1_0_out XfbBuffer 1
> +               OpDecorate %stream1_0_out XfbStride 8
> +               OpDecorate %stream1_0_out Offset 0
> +       %void = OpTypeVoid
> +          %3 = OpTypeFunction %void
> +      %float = OpTypeFloat 32
> +    %v4float = OpTypeVector %float 4
> +       %uint = OpTypeInt 32 0
> +     %uint_1 = OpConstant %uint 1
> +%_arr_float_uint_1 = OpTypeArray %float %uint_1
> +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
> +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
> +          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
> +        %int = OpTypeInt 32 1
> +      %int_0 = OpConstant %int 0
> +%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1
> +%_arr_gl_PerVertex_0_uint_1 = OpTypeArray %gl_PerVertex_0 %uint_1
> +%_ptr_Input__arr_gl_PerVertex_0_uint_1 = OpTypePointer Input %_arr_gl_PerVertex_0_uint_1
> +      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_1 Input
> +%_ptr_Input_v4float = OpTypePointer Input %v4float
> +%_ptr_Output_v4float = OpTypePointer Output %v4float
> +%_ptr_Output_float = OpTypePointer Output %float
> +%stream0_0_out = OpVariable %_ptr_Output_float Output
> +    %float_0 = OpConstant %float 0
> +%stream2_0_out = OpVariable %_ptr_Output_float Output
> +%stream2_1_out = OpVariable %_ptr_Output_v4float Output
> +    %float_1 = OpConstant %float 1
> +    %float_2 = OpConstant %float 2
> +    %float_3 = OpConstant %float 3
> +    %float_4 = OpConstant %float 4
> +         %34 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4
> +      %int_2 = OpConstant %int 2
> +    %v2float = OpTypeVector %float 2
> +%_ptr_Output_v2float = OpTypePointer Output %v2float
> +%stream1_0_out = OpVariable %_ptr_Output_v2float Output
> +         %39 = OpConstantComposite %v2float %float_0 %float_1
> +      %int_1 = OpConstant %int 1
> +       %main = OpFunction %void None %3
> +          %5 = OpLabel
> +         %21 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
> +         %22 = OpLoad %v4float %21
> +         %24 = OpAccessChain %_ptr_Output_v4float %_ %int_0
> +               OpStore %24 %22
> +               OpStore %stream0_0_out %float_0
> +               OpEmitStreamVertex %int_0
> +               OpEndStreamPrimitive %int_0
> +               OpStore %stream2_0_out %float_0
> +               OpStore %stream2_1_out %34
> +               OpEmitStreamVertex %int_2
> +               OpEndStreamPrimitive %int_2
> +               OpStore %stream1_0_out %39
> +               OpEmitStreamVertex %int_1
> +               OpEndStreamPrimitive %int_1
> +               OpReturn
> +               OpFunctionEnd
> +
> +[geometry shader]
> +#version 450
> +
> +layout(points) in;
> +layout(points, max_vertices = 3) out;
> +
> +layout(xfb_buffer = 0, xfb_stride = 4) out;
> +layout(xfb_buffer = 1, xfb_stride = 8) out;
> +layout(xfb_buffer = 2, xfb_stride = 20) out;
> +
> +layout(stream = 0, location = 0, xfb_buffer = 0, xfb_offset = 0)
> +out float stream0_0_out;
> +layout(stream = 1, location = 1, xfb_buffer = 1, xfb_offset = 0)
> +out vec2 stream1_0_out;
> +layout(stream = 2, location = 2, xfb_buffer = 2, xfb_offset = 0)
> +out float stream2_0_out;
> +layout(stream = 2, location = 3, xfb_buffer = 2, xfb_offset = 4)
> +out vec4 stream2_1_out;
> +
> +void main() {
> +  gl_Position = gl_in[0].gl_Position;
> +  stream0_0_out = 0.0;
> +  EmitStreamVertex(0);
> +  EndStreamPrimitive(0);
> +
> +  stream2_0_out = 0.0;
> +  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);
> +  EmitStreamVertex(2);
> +  EndStreamPrimitive(2);
> +
> +  stream1_0_out = vec2(0.0, 1.0);
> +  EmitStreamVertex(1);
> +  EndStreamPrimitive(1);
> +}
> diff --git a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
> index 37ca7a141..50f8b101a 100644
> --- a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
> +++ b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
> @@ -22,6 +22,7 @@
>    */
>   
>   #include "piglit-util-gl.h"
> +#include "piglit-shader-test.h"
>   
>   /**
>    * @file xfb-streams-without-invocations.c
> @@ -41,51 +42,84 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
>   
>   PIGLIT_GL_TEST_CONFIG_END
>   
> -static const char vs_pass_thru_text[] =
> -	"#version 150\n"
> -	"void main() {\n"
> -	"  gl_Position = vec4(0.0);\n"
> -	"}\n";
> -
> -static const char gs_text[] =
> -	"#version 150\n"
> -	"#extension GL_ARB_gpu_shader5 : enable\n"
> -	"layout(points) in;\n"
> -	"layout(points, max_vertices = 3) out;\n"
> -	"layout(stream = 0) out float stream0_0_out;\n"
> -	"layout(stream = 1) out vec2 stream1_0_out;\n"
> -	"layout(stream = 2) out float stream2_0_out;\n"
> -	"layout(stream = 2) out vec4 stream2_1_out;\n"
> -	"void main() {\n"
> -	"  gl_Position = gl_in[0].gl_Position;\n"
> -	"  stream0_0_out = 0.0;\n"
> -	"  EmitStreamVertex(0);\n"
> -	"  EndStreamPrimitive(0);\n"
> -
> -	"  stream2_0_out = 0.0;\n"
> -	"  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);\n"
> -	"  EmitStreamVertex(2);\n"
> -	"  EndStreamPrimitive(2);\n"
> -
> -	"  stream1_0_out = vec2(0.0, 1.0);\n"
> -	"  EmitStreamVertex(1);\n"
> -	"  EndStreamPrimitive(1);\n"
> -	"}";
> -
>   int stream_float_counts[] = { 1, 2, 5, 0 };
> +static bool use_spirv = false;
>   
>   #define STREAMS 4
>   
> +#define SHADER_TEST_FILE_NAME "xfb_streams_without_invocations.shader_test"
> +char shader_test_filename[4096];
> +
>   static const char *varyings[] = {
>   	"stream0_0_out", "gl_NextBuffer",
>   	"stream1_0_out", "gl_NextBuffer",
>   	"stream2_0_out", "stream2_1_out"
>   };
>   
> -static void
> -build_and_use_program()
> +
> +static GLuint
> +assemble_spirv_shader(GLenum shader_type)
> +{
> +	char *shader_asm;
> +	unsigned shader_asm_size;
> +	GLuint shader;
> +
> +	if (!piglit_load_source_from_shader_test(shader_test_filename,
> +						 shader_type, true,
> +						 &shader_asm, &shader_asm_size)) {
> +		piglit_report_result(PIGLIT_FAIL);
> +	}
> +
> +	shader = piglit_assemble_spirv(shader_type,
> +				       shader_asm_size,
> +				       shader_asm);
> +	free(shader_asm);
> +
> +	glSpecializeShader(shader,
> +			   "main",
> +			   0, /* numSpecializationConstants */
> +			   NULL /* pConstantIndex */,
> +			   NULL /* pConstantValue */);
> +
> +	return shader;
> +}
> +
> +static GLuint
> +build_spirv_program(void)
> +{
> +	GLuint prog, shader;
> +
> +	prog = glCreateProgram();
> +
> +	shader = assemble_spirv_shader(GL_VERTEX_SHADER);
> +	glAttachShader(prog, shader);
> +	glDeleteShader(shader);
> +
> +	shader = assemble_spirv_shader(GL_GEOMETRY_SHADER);
> +	glAttachShader(prog, shader);
> +	glDeleteShader(shader);
> +
> +	return prog;
> +}
> +
> +static GLuint
> +build_glsl_program()
>   {
>   	GLuint prog;
> +	char *gs_text;
> +	char *vs_pass_thru_text;
> +
> +	if (!piglit_load_source_from_shader_test(shader_test_filename,
> +						 GL_GEOMETRY_SHADER, false,
> +						 &gs_text, NULL))
> +		return 0;
> +
> +
> +	if (!piglit_load_source_from_shader_test(shader_test_filename,
> +						 GL_VERTEX_SHADER, false,
> +						 &vs_pass_thru_text, NULL))
> +		return 0;
> +
>   
>   	prog = piglit_build_simple_program_multiple_shaders(
>   			GL_VERTEX_SHADER, vs_pass_thru_text,
> @@ -94,6 +128,22 @@ build_and_use_program()
>   	glTransformFeedbackVaryings(prog, ARRAY_SIZE(varyings), varyings,
>   			GL_INTERLEAVED_ATTRIBS);
>   
> +	free(gs_text);
> +	free(vs_pass_thru_text);
> +
> +	return prog;
> +}
> +
> +static void
> +build_and_use_program()
> +{
> +	GLuint prog;
> +
> +	if (use_spirv)
> +		prog = build_spirv_program();
> +	else
> +		prog = build_glsl_program();
> +
>   	glLinkProgram(prog);
>   	if (!piglit_link_check_status(prog))
>   		piglit_report_result(PIGLIT_FAIL);
> @@ -193,6 +243,25 @@ piglit_init(int argc, char **argv)
>   	piglit_require_extension("GL_ARB_gpu_shader5");
>   	piglit_require_extension("GL_ARB_transform_feedback3");
>   
> +	for (i = 1; i < argc; i++) {
> +		if (!strcmp(argv[i], "spirv"))
> +			use_spirv = true;
> +	}
> +
> +	if (use_spirv)
> +		piglit_require_extension("GL_ARB_gl_spirv");
> +
> +	piglit_join_paths(shader_test_filename,
> +			  sizeof(shader_test_filename),
> +			  7, /* num parts */
> +			  piglit_source_dir(),
> +			  "tests",
> +			  "spec",
> +			  "arb_gpu_shader5",
> +			  "execution",
> +			  "shader_test",
> +			  SHADER_TEST_FILE_NAME);
> +
>   	build_and_use_program();
>   
>   	/* Set up the transform feedback buffers. */
>
On 18/08/18 14:32, Timothy Arceri wrote:
> Won't this cause shader runner to needlessly parse the .shader_test file?

The file extension is also confusing. Maybe we should name these type of 
files .shader_source or something similar rather than .shader_test ???

> 
> On 09/08/18 21:36, Alejandro Piñeiro wrote:
>> From: Neil Roberts <nroberts@igalia.com>
>>
>> v2: use shader_test file with the spirv assembly, instead of include
>>      two SPIRV binaries (Alejandro Piñeiro)
>>
>> Signed-off-by: Neil Roberts <nroberts@igalia.com>
>> Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
>> ---
>>   tests/opengl.py                                    |   1 +
>>   .../xfb_streams_without_invocations.shader_test    | 197 
>> +++++++++++++++++++++
>>   .../execution/xfb-streams-without-invocations.c    | 135 ++++++++++----
>>   3 files changed, 300 insertions(+), 33 deletions(-)
>>   create mode 100644 
>> tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test 
>>
>>
>> diff --git a/tests/opengl.py b/tests/opengl.py
>> index 064c43e08..9b1e09564 100644
>> --- a/tests/opengl.py
>> +++ b/tests/opengl.py
>> @@ -1969,6 +1969,7 @@ with profile.test_list.group_manager(
>>       g(['arb_gpu_shader5-emitstreamvertex_stream_too_large'])
>>       g(['arb_gpu_shader5-tf-wrong-stream-value'])
>>       g(['arb_gpu_shader5-xfb-streams-without-invocations'])
>> +    g(['arb_gpu_shader5-xfb-streams-without-invocations', 'spirv'])
>>       g(['arb_gpu_shader5-emitstreamvertex_nodraw'])
>>       g(['arb_gpu_shader5-interpolateAtCentroid'])
>>       g(['arb_gpu_shader5-interpolateAtCentroid-packing'])
>> diff --git 
>> a/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test 
>> b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test 
>>
>> new file mode 100644
>> index 000000000..6611e0bf8
>> --- /dev/null
>> +++ 
>> b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test 
>>
>> @@ -0,0 +1,197 @@
>> +[require]
>> +GLSL >= 4.50
>> +
>> +[vertex shader spirv]
>> +; Automatically generated from the GLSL by shader_test_spirv.py. DO 
>> NOT EDIT
>> +; SPIR-V
>> +; Version: 1.0
>> +; Generator: Khronos Glslang Reference Front End; 7
>> +; Bound: 23
>> +; Schema: 0
>> +               OpCapability Shader
>> +          %1 = OpExtInstImport "GLSL.std.450"
>> +               OpMemoryModel Logical GLSL450
>> +               OpEntryPoint Vertex %main "main" %_ %gl_VertexID 
>> %gl_InstanceID
>> +               OpSource GLSL 450
>> +               OpName %_ ""
>> +               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
>> +               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
>> +               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
>> +               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
>> +               OpDecorate %gl_PerVertex Block
>> +               OpDecorate %gl_VertexID BuiltIn VertexId
>> +               OpDecorate %gl_InstanceID BuiltIn InstanceId
>> +       %void = OpTypeVoid
>> +          %3 = OpTypeFunction %void
>> +      %float = OpTypeFloat 32
>> +    %v4float = OpTypeVector %float 4
>> +       %uint = OpTypeInt 32 0
>> +     %uint_1 = OpConstant %uint 1
>> +%_arr_float_uint_1 = OpTypeArray %float %uint_1
>> +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 
>> %_arr_float_uint_1
>> +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
>> +          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
>> +        %int = OpTypeInt 32 1
>> +      %int_0 = OpConstant %int 0
>> +    %float_0 = OpConstant %float 0
>> +         %17 = OpConstantComposite %v4float %float_0 %float_0 
>> %float_0 %float_0
>> +%_ptr_Output_v4float = OpTypePointer Output %v4float
>> +%_ptr_Input_int = OpTypePointer Input %int
>> +%gl_VertexID = OpVariable %_ptr_Input_int Input
>> +%gl_InstanceID = OpVariable %_ptr_Input_int Input
>> +       %main = OpFunction %void None %3
>> +          %5 = OpLabel
>> +         %19 = OpAccessChain %_ptr_Output_v4float %_ %int_0
>> +               OpStore %19 %17
>> +               OpReturn
>> +               OpFunctionEnd
>> +
>> +[vertex shader]
>> +#version 450
>> +
>> +void main() {
>> +     gl_Position = vec4(0.0);
>> +}
>> +
>> +
>> +[geometry shader spirv]
>> +; Automatically generated from the GLSL by shader_test_spirv.py. DO 
>> NOT EDIT
>> +; SPIR-V
>> +; Version: 1.0
>> +; Generator: Khronos Glslang Reference Front End; 7
>> +; Bound: 41
>> +; Schema: 0
>> +               OpCapability Geometry
>> +               OpCapability TransformFeedback
>> +               OpCapability GeometryStreams
>> +          %1 = OpExtInstImport "GLSL.std.450"
>> +               OpMemoryModel Logical GLSL450
>> +               OpEntryPoint Geometry %main "main" %_ %gl_in 
>> %stream0_0_out %stream2_0_out %stream2_1_out %stream1_0_out
>> +               OpExecutionMode %main Xfb
>> +               OpExecutionMode %main InputPoints
>> +               OpExecutionMode %main Invocations 1
>> +               OpExecutionMode %main OutputPoints
>> +               OpExecutionMode %main OutputVertices 3
>> +               OpSource GLSL 450
>> +               OpName %_ ""
>> +               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
>> +               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
>> +               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
>> +               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
>> +               OpDecorate %gl_PerVertex Block
>> +               OpDecorate %gl_PerVertex Stream 0
>> +               OpDecorate %_ Stream 0
>> +               OpDecorate %_ XfbBuffer 0
>> +               OpDecorate %_ XfbStride 4
>> +               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
>> +               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
>> +               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
>> +               OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
>> +               OpDecorate %gl_PerVertex_0 Block
>> +               OpDecorate %stream0_0_out Location 0
>> +               OpDecorate %stream0_0_out Stream 0
>> +               OpDecorate %stream0_0_out XfbBuffer 0
>> +               OpDecorate %stream0_0_out XfbStride 4
>> +               OpDecorate %stream0_0_out Offset 0
>> +               OpDecorate %stream2_0_out Location 2
>> +               OpDecorate %stream2_0_out Stream 2
>> +               OpDecorate %stream2_0_out XfbBuffer 2
>> +               OpDecorate %stream2_0_out XfbStride 20
>> +               OpDecorate %stream2_0_out Offset 0
>> +               OpDecorate %stream2_1_out Location 3
>> +               OpDecorate %stream2_1_out Stream 2
>> +               OpDecorate %stream2_1_out XfbBuffer 2
>> +               OpDecorate %stream2_1_out XfbStride 20
>> +               OpDecorate %stream2_1_out Offset 4
>> +               OpDecorate %stream1_0_out Location 1
>> +               OpDecorate %stream1_0_out Stream 1
>> +               OpDecorate %stream1_0_out XfbBuffer 1
>> +               OpDecorate %stream1_0_out XfbStride 8
>> +               OpDecorate %stream1_0_out Offset 0
>> +       %void = OpTypeVoid
>> +          %3 = OpTypeFunction %void
>> +      %float = OpTypeFloat 32
>> +    %v4float = OpTypeVector %float 4
>> +       %uint = OpTypeInt 32 0
>> +     %uint_1 = OpConstant %uint 1
>> +%_arr_float_uint_1 = OpTypeArray %float %uint_1
>> +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 
>> %_arr_float_uint_1
>> +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
>> +          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
>> +        %int = OpTypeInt 32 1
>> +      %int_0 = OpConstant %int 0
>> +%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1 
>> %_arr_float_uint_1
>> +%_arr_gl_PerVertex_0_uint_1 = OpTypeArray %gl_PerVertex_0 %uint_1
>> +%_ptr_Input__arr_gl_PerVertex_0_uint_1 = OpTypePointer Input 
>> %_arr_gl_PerVertex_0_uint_1
>> +      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_1 Input
>> +%_ptr_Input_v4float = OpTypePointer Input %v4float
>> +%_ptr_Output_v4float = OpTypePointer Output %v4float
>> +%_ptr_Output_float = OpTypePointer Output %float
>> +%stream0_0_out = OpVariable %_ptr_Output_float Output
>> +    %float_0 = OpConstant %float 0
>> +%stream2_0_out = OpVariable %_ptr_Output_float Output
>> +%stream2_1_out = OpVariable %_ptr_Output_v4float Output
>> +    %float_1 = OpConstant %float 1
>> +    %float_2 = OpConstant %float 2
>> +    %float_3 = OpConstant %float 3
>> +    %float_4 = OpConstant %float 4
>> +         %34 = OpConstantComposite %v4float %float_1 %float_2 
>> %float_3 %float_4
>> +      %int_2 = OpConstant %int 2
>> +    %v2float = OpTypeVector %float 2
>> +%_ptr_Output_v2float = OpTypePointer Output %v2float
>> +%stream1_0_out = OpVariable %_ptr_Output_v2float Output
>> +         %39 = OpConstantComposite %v2float %float_0 %float_1
>> +      %int_1 = OpConstant %int 1
>> +       %main = OpFunction %void None %3
>> +          %5 = OpLabel
>> +         %21 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
>> +         %22 = OpLoad %v4float %21
>> +         %24 = OpAccessChain %_ptr_Output_v4float %_ %int_0
>> +               OpStore %24 %22
>> +               OpStore %stream0_0_out %float_0
>> +               OpEmitStreamVertex %int_0
>> +               OpEndStreamPrimitive %int_0
>> +               OpStore %stream2_0_out %float_0
>> +               OpStore %stream2_1_out %34
>> +               OpEmitStreamVertex %int_2
>> +               OpEndStreamPrimitive %int_2
>> +               OpStore %stream1_0_out %39
>> +               OpEmitStreamVertex %int_1
>> +               OpEndStreamPrimitive %int_1
>> +               OpReturn
>> +               OpFunctionEnd
>> +
>> +[geometry shader]
>> +#version 450
>> +
>> +layout(points) in;
>> +layout(points, max_vertices = 3) out;
>> +
>> +layout(xfb_buffer = 0, xfb_stride = 4) out;
>> +layout(xfb_buffer = 1, xfb_stride = 8) out;
>> +layout(xfb_buffer = 2, xfb_stride = 20) out;
>> +
>> +layout(stream = 0, location = 0, xfb_buffer = 0, xfb_offset = 0)
>> +out float stream0_0_out;
>> +layout(stream = 1, location = 1, xfb_buffer = 1, xfb_offset = 0)
>> +out vec2 stream1_0_out;
>> +layout(stream = 2, location = 2, xfb_buffer = 2, xfb_offset = 0)
>> +out float stream2_0_out;
>> +layout(stream = 2, location = 3, xfb_buffer = 2, xfb_offset = 4)
>> +out vec4 stream2_1_out;
>> +
>> +void main() {
>> +  gl_Position = gl_in[0].gl_Position;
>> +  stream0_0_out = 0.0;
>> +  EmitStreamVertex(0);
>> +  EndStreamPrimitive(0);
>> +
>> +  stream2_0_out = 0.0;
>> +  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);
>> +  EmitStreamVertex(2);
>> +  EndStreamPrimitive(2);
>> +
>> +  stream1_0_out = vec2(0.0, 1.0);
>> +  EmitStreamVertex(1);
>> +  EndStreamPrimitive(1);
>> +}
>> diff --git 
>> a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c 
>> b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
>> index 37ca7a141..50f8b101a 100644
>> --- 
>> a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
>> +++ 
>> b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
>> @@ -22,6 +22,7 @@
>>    */
>>   #include "piglit-util-gl.h"
>> +#include "piglit-shader-test.h"
>>   /**
>>    * @file xfb-streams-without-invocations.c
>> @@ -41,51 +42,84 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
>>   PIGLIT_GL_TEST_CONFIG_END
>> -static const char vs_pass_thru_text[] =
>> -    "#version 150\n"
>> -    "void main() {\n"
>> -    "  gl_Position = vec4(0.0);\n"
>> -    "}\n";
>> -
>> -static const char gs_text[] =
>> -    "#version 150\n"
>> -    "#extension GL_ARB_gpu_shader5 : enable\n"
>> -    "layout(points) in;\n"
>> -    "layout(points, max_vertices = 3) out;\n"
>> -    "layout(stream = 0) out float stream0_0_out;\n"
>> -    "layout(stream = 1) out vec2 stream1_0_out;\n"
>> -    "layout(stream = 2) out float stream2_0_out;\n"
>> -    "layout(stream = 2) out vec4 stream2_1_out;\n"
>> -    "void main() {\n"
>> -    "  gl_Position = gl_in[0].gl_Position;\n"
>> -    "  stream0_0_out = 0.0;\n"
>> -    "  EmitStreamVertex(0);\n"
>> -    "  EndStreamPrimitive(0);\n"
>> -
>> -    "  stream2_0_out = 0.0;\n"
>> -    "  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);\n"
>> -    "  EmitStreamVertex(2);\n"
>> -    "  EndStreamPrimitive(2);\n"
>> -
>> -    "  stream1_0_out = vec2(0.0, 1.0);\n"
>> -    "  EmitStreamVertex(1);\n"
>> -    "  EndStreamPrimitive(1);\n"
>> -    "}";
>> -
>>   int stream_float_counts[] = { 1, 2, 5, 0 };
>> +static bool use_spirv = false;
>>   #define STREAMS 4
>> +#define SHADER_TEST_FILE_NAME 
>> "xfb_streams_without_invocations.shader_test"
>> +char shader_test_filename[4096];
>> +
>>   static const char *varyings[] = {
>>       "stream0_0_out", "gl_NextBuffer",
>>       "stream1_0_out", "gl_NextBuffer",
>>       "stream2_0_out", "stream2_1_out"
>>   };
>> -static void
>> -build_and_use_program()
>> +
>> +static GLuint
>> +assemble_spirv_shader(GLenum shader_type)
>> +{
>> +    char *shader_asm;
>> +    unsigned shader_asm_size;
>> +    GLuint shader;
>> +
>> +    if (!piglit_load_source_from_shader_test(shader_test_filename,
>> +                         shader_type, true,
>> +                         &shader_asm, &shader_asm_size)) {
>> +        piglit_report_result(PIGLIT_FAIL);
>> +    }
>> +
>> +    shader = piglit_assemble_spirv(shader_type,
>> +                       shader_asm_size,
>> +                       shader_asm);
>> +    free(shader_asm);
>> +
>> +    glSpecializeShader(shader,
>> +               "main",
>> +               0, /* numSpecializationConstants */
>> +               NULL /* pConstantIndex */,
>> +               NULL /* pConstantValue */);
>> +
>> +    return shader;
>> +}
>> +
>> +static GLuint
>> +build_spirv_program(void)
>> +{
>> +    GLuint prog, shader;
>> +
>> +    prog = glCreateProgram();
>> +
>> +    shader = assemble_spirv_shader(GL_VERTEX_SHADER);
>> +    glAttachShader(prog, shader);
>> +    glDeleteShader(shader);
>> +
>> +    shader = assemble_spirv_shader(GL_GEOMETRY_SHADER);
>> +    glAttachShader(prog, shader);
>> +    glDeleteShader(shader);
>> +
>> +    return prog;
>> +}
>> +
>> +static GLuint
>> +build_glsl_program()
>>   {
>>       GLuint prog;
>> +    char *gs_text;
>> +    char *vs_pass_thru_text;
>> +
>> +    if (!piglit_load_source_from_shader_test(shader_test_filename,
>> +                         GL_GEOMETRY_SHADER, false,
>> +                         &gs_text, NULL))
>> +        return 0;
>> +
>> +
>> +    if (!piglit_load_source_from_shader_test(shader_test_filename,
>> +                         GL_VERTEX_SHADER, false,
>> +                         &vs_pass_thru_text, NULL))
>> +        return 0;
>> +
>>       prog = piglit_build_simple_program_multiple_shaders(
>>               GL_VERTEX_SHADER, vs_pass_thru_text,
>> @@ -94,6 +128,22 @@ build_and_use_program()
>>       glTransformFeedbackVaryings(prog, ARRAY_SIZE(varyings), varyings,
>>               GL_INTERLEAVED_ATTRIBS);
>> +    free(gs_text);
>> +    free(vs_pass_thru_text);
>> +
>> +    return prog;
>> +}
>> +
>> +static void
>> +build_and_use_program()
>> +{
>> +    GLuint prog;
>> +
>> +    if (use_spirv)
>> +        prog = build_spirv_program();
>> +    else
>> +        prog = build_glsl_program();
>> +
>>       glLinkProgram(prog);
>>       if (!piglit_link_check_status(prog))
>>           piglit_report_result(PIGLIT_FAIL);
>> @@ -193,6 +243,25 @@ piglit_init(int argc, char **argv)
>>       piglit_require_extension("GL_ARB_gpu_shader5");
>>       piglit_require_extension("GL_ARB_transform_feedback3");
>> +    for (i = 1; i < argc; i++) {
>> +        if (!strcmp(argv[i], "spirv"))
>> +            use_spirv = true;
>> +    }
>> +
>> +    if (use_spirv)
>> +        piglit_require_extension("GL_ARB_gl_spirv");
>> +
>> +    piglit_join_paths(shader_test_filename,
>> +              sizeof(shader_test_filename),
>> +              7, /* num parts */
>> +              piglit_source_dir(),
>> +              "tests",
>> +              "spec",
>> +              "arb_gpu_shader5",
>> +              "execution",
>> +              "shader_test",
>> +              SHADER_TEST_FILE_NAME);
>> +
>>       build_and_use_program();
>>       /* Set up the transform feedback buffers. */
>>
> _______________________________________________
> Piglit mailing list
> Piglit@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/piglit
On 18/08/18 06:36, Timothy Arceri wrote:
> On 18/08/18 14:32, Timothy Arceri wrote:
>> Won't this cause shader runner to needlessly parse the .shader_test
>> file?

True, good point. In any case, as the test lacks a [test] section, full
shader.py runs would just check if the test links (assuming that
ARB_gl_spirv are available). Having said so ...

>
> The file extension is also confusing. Maybe we should name these type
> of files .shader_source or something similar rather than .shader_test ???

... this makes sense. That name fits better, and would avoid the
previous issue. As that would be a small change, I will make the change
locally, while I wait for the review of the other patches.

Thanks pointing that out

>
>>
>> On 09/08/18 21:36, Alejandro Piñeiro wrote:
>>> From: Neil Roberts <nroberts@igalia.com>
>>>
>>> v2: use shader_test file with the spirv assembly, instead of include
>>>      two SPIRV binaries (Alejandro Piñeiro)
>>>
>>> Signed-off-by: Neil Roberts <nroberts@igalia.com>
>>> Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
>>> ---
>>>   tests/opengl.py                                    |   1 +
>>>   .../xfb_streams_without_invocations.shader_test    | 197
>>> +++++++++++++++++++++
>>>   .../execution/xfb-streams-without-invocations.c    | 135
>>> ++++++++++----
>>>   3 files changed, 300 insertions(+), 33 deletions(-)
>>>   create mode 100644
>>> tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
>>>
>>>
>>> diff --git a/tests/opengl.py b/tests/opengl.py
>>> index 064c43e08..9b1e09564 100644
>>> --- a/tests/opengl.py
>>> +++ b/tests/opengl.py
>>> @@ -1969,6 +1969,7 @@ with profile.test_list.group_manager(
>>>       g(['arb_gpu_shader5-emitstreamvertex_stream_too_large'])
>>>       g(['arb_gpu_shader5-tf-wrong-stream-value'])
>>>       g(['arb_gpu_shader5-xfb-streams-without-invocations'])
>>> +    g(['arb_gpu_shader5-xfb-streams-without-invocations', 'spirv'])
>>>       g(['arb_gpu_shader5-emitstreamvertex_nodraw'])
>>>       g(['arb_gpu_shader5-interpolateAtCentroid'])
>>>       g(['arb_gpu_shader5-interpolateAtCentroid-packing'])
>>> diff --git
>>> a/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
>>> b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
>>>
>>> new file mode 100644
>>> index 000000000..6611e0bf8
>>> --- /dev/null
>>> +++
>>> b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
>>>
>>> @@ -0,0 +1,197 @@
>>> +[require]
>>> +GLSL >= 4.50
>>> +
>>> +[vertex shader spirv]
>>> +; Automatically generated from the GLSL by shader_test_spirv.py. DO
>>> NOT EDIT
>>> +; SPIR-V
>>> +; Version: 1.0
>>> +; Generator: Khronos Glslang Reference Front End; 7
>>> +; Bound: 23
>>> +; Schema: 0
>>> +               OpCapability Shader
>>> +          %1 = OpExtInstImport "GLSL.std.450"
>>> +               OpMemoryModel Logical GLSL450
>>> +               OpEntryPoint Vertex %main "main" %_ %gl_VertexID
>>> %gl_InstanceID
>>> +               OpSource GLSL 450
>>> +               OpName %_ ""
>>> +               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
>>> +               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
>>> +               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
>>> +               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
>>> +               OpDecorate %gl_PerVertex Block
>>> +               OpDecorate %gl_VertexID BuiltIn VertexId
>>> +               OpDecorate %gl_InstanceID BuiltIn InstanceId
>>> +       %void = OpTypeVoid
>>> +          %3 = OpTypeFunction %void
>>> +      %float = OpTypeFloat 32
>>> +    %v4float = OpTypeVector %float 4
>>> +       %uint = OpTypeInt 32 0
>>> +     %uint_1 = OpConstant %uint 1
>>> +%_arr_float_uint_1 = OpTypeArray %float %uint_1
>>> +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
>>> %_arr_float_uint_1
>>> +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
>>> +          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
>>> +        %int = OpTypeInt 32 1
>>> +      %int_0 = OpConstant %int 0
>>> +    %float_0 = OpConstant %float 0
>>> +         %17 = OpConstantComposite %v4float %float_0 %float_0
>>> %float_0 %float_0
>>> +%_ptr_Output_v4float = OpTypePointer Output %v4float
>>> +%_ptr_Input_int = OpTypePointer Input %int
>>> +%gl_VertexID = OpVariable %_ptr_Input_int Input
>>> +%gl_InstanceID = OpVariable %_ptr_Input_int Input
>>> +       %main = OpFunction %void None %3
>>> +          %5 = OpLabel
>>> +         %19 = OpAccessChain %_ptr_Output_v4float %_ %int_0
>>> +               OpStore %19 %17
>>> +               OpReturn
>>> +               OpFunctionEnd
>>> +
>>> +[vertex shader]
>>> +#version 450
>>> +
>>> +void main() {
>>> +     gl_Position = vec4(0.0);
>>> +}
>>> +
>>> +
>>> +[geometry shader spirv]
>>> +; Automatically generated from the GLSL by shader_test_spirv.py. DO
>>> NOT EDIT
>>> +; SPIR-V
>>> +; Version: 1.0
>>> +; Generator: Khronos Glslang Reference Front End; 7
>>> +; Bound: 41
>>> +; Schema: 0
>>> +               OpCapability Geometry
>>> +               OpCapability TransformFeedback
>>> +               OpCapability GeometryStreams
>>> +          %1 = OpExtInstImport "GLSL.std.450"
>>> +               OpMemoryModel Logical GLSL450
>>> +               OpEntryPoint Geometry %main "main" %_ %gl_in
>>> %stream0_0_out %stream2_0_out %stream2_1_out %stream1_0_out
>>> +               OpExecutionMode %main Xfb
>>> +               OpExecutionMode %main InputPoints
>>> +               OpExecutionMode %main Invocations 1
>>> +               OpExecutionMode %main OutputPoints
>>> +               OpExecutionMode %main OutputVertices 3
>>> +               OpSource GLSL 450
>>> +               OpName %_ ""
>>> +               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position
>>> +               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize
>>> +               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance
>>> +               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance
>>> +               OpDecorate %gl_PerVertex Block
>>> +               OpDecorate %gl_PerVertex Stream 0
>>> +               OpDecorate %_ Stream 0
>>> +               OpDecorate %_ XfbBuffer 0
>>> +               OpDecorate %_ XfbStride 4
>>> +               OpMemberDecorate %gl_PerVertex_0 0 BuiltIn Position
>>> +               OpMemberDecorate %gl_PerVertex_0 1 BuiltIn PointSize
>>> +               OpMemberDecorate %gl_PerVertex_0 2 BuiltIn ClipDistance
>>> +               OpMemberDecorate %gl_PerVertex_0 3 BuiltIn CullDistance
>>> +               OpDecorate %gl_PerVertex_0 Block
>>> +               OpDecorate %stream0_0_out Location 0
>>> +               OpDecorate %stream0_0_out Stream 0
>>> +               OpDecorate %stream0_0_out XfbBuffer 0
>>> +               OpDecorate %stream0_0_out XfbStride 4
>>> +               OpDecorate %stream0_0_out Offset 0
>>> +               OpDecorate %stream2_0_out Location 2
>>> +               OpDecorate %stream2_0_out Stream 2
>>> +               OpDecorate %stream2_0_out XfbBuffer 2
>>> +               OpDecorate %stream2_0_out XfbStride 20
>>> +               OpDecorate %stream2_0_out Offset 0
>>> +               OpDecorate %stream2_1_out Location 3
>>> +               OpDecorate %stream2_1_out Stream 2
>>> +               OpDecorate %stream2_1_out XfbBuffer 2
>>> +               OpDecorate %stream2_1_out XfbStride 20
>>> +               OpDecorate %stream2_1_out Offset 4
>>> +               OpDecorate %stream1_0_out Location 1
>>> +               OpDecorate %stream1_0_out Stream 1
>>> +               OpDecorate %stream1_0_out XfbBuffer 1
>>> +               OpDecorate %stream1_0_out XfbStride 8
>>> +               OpDecorate %stream1_0_out Offset 0
>>> +       %void = OpTypeVoid
>>> +          %3 = OpTypeFunction %void
>>> +      %float = OpTypeFloat 32
>>> +    %v4float = OpTypeVector %float 4
>>> +       %uint = OpTypeInt 32 0
>>> +     %uint_1 = OpConstant %uint 1
>>> +%_arr_float_uint_1 = OpTypeArray %float %uint_1
>>> +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1
>>> %_arr_float_uint_1
>>> +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex
>>> +          %_ = OpVariable %_ptr_Output_gl_PerVertex Output
>>> +        %int = OpTypeInt 32 1
>>> +      %int_0 = OpConstant %int 0
>>> +%gl_PerVertex_0 = OpTypeStruct %v4float %float %_arr_float_uint_1
>>> %_arr_float_uint_1
>>> +%_arr_gl_PerVertex_0_uint_1 = OpTypeArray %gl_PerVertex_0 %uint_1
>>> +%_ptr_Input__arr_gl_PerVertex_0_uint_1 = OpTypePointer Input
>>> %_arr_gl_PerVertex_0_uint_1
>>> +      %gl_in = OpVariable %_ptr_Input__arr_gl_PerVertex_0_uint_1 Input
>>> +%_ptr_Input_v4float = OpTypePointer Input %v4float
>>> +%_ptr_Output_v4float = OpTypePointer Output %v4float
>>> +%_ptr_Output_float = OpTypePointer Output %float
>>> +%stream0_0_out = OpVariable %_ptr_Output_float Output
>>> +    %float_0 = OpConstant %float 0
>>> +%stream2_0_out = OpVariable %_ptr_Output_float Output
>>> +%stream2_1_out = OpVariable %_ptr_Output_v4float Output
>>> +    %float_1 = OpConstant %float 1
>>> +    %float_2 = OpConstant %float 2
>>> +    %float_3 = OpConstant %float 3
>>> +    %float_4 = OpConstant %float 4
>>> +         %34 = OpConstantComposite %v4float %float_1 %float_2
>>> %float_3 %float_4
>>> +      %int_2 = OpConstant %int 2
>>> +    %v2float = OpTypeVector %float 2
>>> +%_ptr_Output_v2float = OpTypePointer Output %v2float
>>> +%stream1_0_out = OpVariable %_ptr_Output_v2float Output
>>> +         %39 = OpConstantComposite %v2float %float_0 %float_1
>>> +      %int_1 = OpConstant %int 1
>>> +       %main = OpFunction %void None %3
>>> +          %5 = OpLabel
>>> +         %21 = OpAccessChain %_ptr_Input_v4float %gl_in %int_0 %int_0
>>> +         %22 = OpLoad %v4float %21
>>> +         %24 = OpAccessChain %_ptr_Output_v4float %_ %int_0
>>> +               OpStore %24 %22
>>> +               OpStore %stream0_0_out %float_0
>>> +               OpEmitStreamVertex %int_0
>>> +               OpEndStreamPrimitive %int_0
>>> +               OpStore %stream2_0_out %float_0
>>> +               OpStore %stream2_1_out %34
>>> +               OpEmitStreamVertex %int_2
>>> +               OpEndStreamPrimitive %int_2
>>> +               OpStore %stream1_0_out %39
>>> +               OpEmitStreamVertex %int_1
>>> +               OpEndStreamPrimitive %int_1
>>> +               OpReturn
>>> +               OpFunctionEnd
>>> +
>>> +[geometry shader]
>>> +#version 450
>>> +
>>> +layout(points) in;
>>> +layout(points, max_vertices = 3) out;
>>> +
>>> +layout(xfb_buffer = 0, xfb_stride = 4) out;
>>> +layout(xfb_buffer = 1, xfb_stride = 8) out;
>>> +layout(xfb_buffer = 2, xfb_stride = 20) out;
>>> +
>>> +layout(stream = 0, location = 0, xfb_buffer = 0, xfb_offset = 0)
>>> +out float stream0_0_out;
>>> +layout(stream = 1, location = 1, xfb_buffer = 1, xfb_offset = 0)
>>> +out vec2 stream1_0_out;
>>> +layout(stream = 2, location = 2, xfb_buffer = 2, xfb_offset = 0)
>>> +out float stream2_0_out;
>>> +layout(stream = 2, location = 3, xfb_buffer = 2, xfb_offset = 4)
>>> +out vec4 stream2_1_out;
>>> +
>>> +void main() {
>>> +  gl_Position = gl_in[0].gl_Position;
>>> +  stream0_0_out = 0.0;
>>> +  EmitStreamVertex(0);
>>> +  EndStreamPrimitive(0);
>>> +
>>> +  stream2_0_out = 0.0;
>>> +  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);
>>> +  EmitStreamVertex(2);
>>> +  EndStreamPrimitive(2);
>>> +
>>> +  stream1_0_out = vec2(0.0, 1.0);
>>> +  EmitStreamVertex(1);
>>> +  EndStreamPrimitive(1);
>>> +}
>>> diff --git
>>> a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
>>> b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
>>>
>>> index 37ca7a141..50f8b101a 100644
>>> ---
>>> a/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
>>>
>>> +++
>>> b/tests/spec/arb_gpu_shader5/execution/xfb-streams-without-invocations.c
>>>
>>> @@ -22,6 +22,7 @@
>>>    */
>>>   #include "piglit-util-gl.h"
>>> +#include "piglit-shader-test.h"
>>>   /**
>>>    * @file xfb-streams-without-invocations.c
>>> @@ -41,51 +42,84 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
>>>   PIGLIT_GL_TEST_CONFIG_END
>>> -static const char vs_pass_thru_text[] =
>>> -    "#version 150\n"
>>> -    "void main() {\n"
>>> -    "  gl_Position = vec4(0.0);\n"
>>> -    "}\n";
>>> -
>>> -static const char gs_text[] =
>>> -    "#version 150\n"
>>> -    "#extension GL_ARB_gpu_shader5 : enable\n"
>>> -    "layout(points) in;\n"
>>> -    "layout(points, max_vertices = 3) out;\n"
>>> -    "layout(stream = 0) out float stream0_0_out;\n"
>>> -    "layout(stream = 1) out vec2 stream1_0_out;\n"
>>> -    "layout(stream = 2) out float stream2_0_out;\n"
>>> -    "layout(stream = 2) out vec4 stream2_1_out;\n"
>>> -    "void main() {\n"
>>> -    "  gl_Position = gl_in[0].gl_Position;\n"
>>> -    "  stream0_0_out = 0.0;\n"
>>> -    "  EmitStreamVertex(0);\n"
>>> -    "  EndStreamPrimitive(0);\n"
>>> -
>>> -    "  stream2_0_out = 0.0;\n"
>>> -    "  stream2_1_out = vec4(1.0, 2.0, 3.0, 4.0);\n"
>>> -    "  EmitStreamVertex(2);\n"
>>> -    "  EndStreamPrimitive(2);\n"
>>> -
>>> -    "  stream1_0_out = vec2(0.0, 1.0);\n"
>>> -    "  EmitStreamVertex(1);\n"
>>> -    "  EndStreamPrimitive(1);\n"
>>> -    "}";
>>> -
>>>   int stream_float_counts[] = { 1, 2, 5, 0 };
>>> +static bool use_spirv = false;
>>>   #define STREAMS 4
>>> +#define SHADER_TEST_FILE_NAME
>>> "xfb_streams_without_invocations.shader_test"
>>> +char shader_test_filename[4096];
>>> +
>>>   static const char *varyings[] = {
>>>       "stream0_0_out", "gl_NextBuffer",
>>>       "stream1_0_out", "gl_NextBuffer",
>>>       "stream2_0_out", "stream2_1_out"
>>>   };
>>> -static void
>>> -build_and_use_program()
>>> +
>>> +static GLuint
>>> +assemble_spirv_shader(GLenum shader_type)
>>> +{
>>> +    char *shader_asm;
>>> +    unsigned shader_asm_size;
>>> +    GLuint shader;
>>> +
>>> +    if (!piglit_load_source_from_shader_test(shader_test_filename,
>>> +                         shader_type, true,
>>> +                         &shader_asm, &shader_asm_size)) {
>>> +        piglit_report_result(PIGLIT_FAIL);
>>> +    }
>>> +
>>> +    shader = piglit_assemble_spirv(shader_type,
>>> +                       shader_asm_size,
>>> +                       shader_asm);
>>> +    free(shader_asm);
>>> +
>>> +    glSpecializeShader(shader,
>>> +               "main",
>>> +               0, /* numSpecializationConstants */
>>> +               NULL /* pConstantIndex */,
>>> +               NULL /* pConstantValue */);
>>> +
>>> +    return shader;
>>> +}
>>> +
>>> +static GLuint
>>> +build_spirv_program(void)
>>> +{
>>> +    GLuint prog, shader;
>>> +
>>> +    prog = glCreateProgram();
>>> +
>>> +    shader = assemble_spirv_shader(GL_VERTEX_SHADER);
>>> +    glAttachShader(prog, shader);
>>> +    glDeleteShader(shader);
>>> +
>>> +    shader = assemble_spirv_shader(GL_GEOMETRY_SHADER);
>>> +    glAttachShader(prog, shader);
>>> +    glDeleteShader(shader);
>>> +
>>> +    return prog;
>>> +}
>>> +
>>> +static GLuint
>>> +build_glsl_program()
>>>   {
>>>       GLuint prog;
>>> +    char *gs_text;
>>> +    char *vs_pass_thru_text;
>>> +
>>> +    if (!piglit_load_source_from_shader_test(shader_test_filename,
>>> +                         GL_GEOMETRY_SHADER, false,
>>> +                         &gs_text, NULL))
>>> +        return 0;
>>> +
>>> +
>>> +    if (!piglit_load_source_from_shader_test(shader_test_filename,
>>> +                         GL_VERTEX_SHADER, false,
>>> +                         &vs_pass_thru_text, NULL))
>>> +        return 0;
>>> +
>>>       prog = piglit_build_simple_program_multiple_shaders(
>>>               GL_VERTEX_SHADER, vs_pass_thru_text,
>>> @@ -94,6 +128,22 @@ build_and_use_program()
>>>       glTransformFeedbackVaryings(prog, ARRAY_SIZE(varyings), varyings,
>>>               GL_INTERLEAVED_ATTRIBS);
>>> +    free(gs_text);
>>> +    free(vs_pass_thru_text);
>>> +
>>> +    return prog;
>>> +}
>>> +
>>> +static void
>>> +build_and_use_program()
>>> +{
>>> +    GLuint prog;
>>> +
>>> +    if (use_spirv)
>>> +        prog = build_spirv_program();
>>> +    else
>>> +        prog = build_glsl_program();
>>> +
>>>       glLinkProgram(prog);
>>>       if (!piglit_link_check_status(prog))
>>>           piglit_report_result(PIGLIT_FAIL);
>>> @@ -193,6 +243,25 @@ piglit_init(int argc, char **argv)
>>>       piglit_require_extension("GL_ARB_gpu_shader5");
>>>       piglit_require_extension("GL_ARB_transform_feedback3");
>>> +    for (i = 1; i < argc; i++) {
>>> +        if (!strcmp(argv[i], "spirv"))
>>> +            use_spirv = true;
>>> +    }
>>> +
>>> +    if (use_spirv)
>>> +        piglit_require_extension("GL_ARB_gl_spirv");
>>> +
>>> +    piglit_join_paths(shader_test_filename,
>>> +              sizeof(shader_test_filename),
>>> +              7, /* num parts */
>>> +              piglit_source_dir(),
>>> +              "tests",
>>> +              "spec",
>>> +              "arb_gpu_shader5",
>>> +              "execution",
>>> +              "shader_test",
>>> +              SHADER_TEST_FILE_NAME);
>>> +
>>>       build_and_use_program();
>>>       /* Set up the transform feedback buffers. */
>>>
>> _______________________________________________
>> Piglit mailing list
>> Piglit@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/piglit
>
On 18/08/18 19:30, Alejandro Piñeiro wrote:
> On 18/08/18 06:36, Timothy Arceri wrote:
>> On 18/08/18 14:32, Timothy Arceri wrote:
>>> Won't this cause shader runner to needlessly parse the .shader_test
>>> file?
> 
> True, good point. In any case, as the test lacks a [test] section, full
> shader.py runs would just check if the test links (assuming that
> ARB_gl_spirv are available). Having said so ...
> 
>>
>> The file extension is also confusing. Maybe we should name these type
>> of files .shader_source or something similar rather than .shader_test ???
> 
> ... this makes sense. That name fits better, and would avoid the
> previous issue. As that would be a small change, I will make the change
> locally, while I wait for the review of the other patches.

I've skimmed over most of the series and I didn't see anything other 
than this that I had issue with. It's not very common to get a full 
review for a piglit series. The general rule is once its been on the 
list for a few weeks it's usually ok to push. After all it's better to 
have wrong tests that can be fixed later than to have no tests at all.

I understand the external dependency might have stopped you from just 
pushing but since its an optional dependency it's fine IMO.

Anyway for the series feel free to add:

Acked-by: Timothy Arceri <tarceri@itsqueeze.com>
On 20/08/18 04:11, Timothy Arceri wrote:
> On 18/08/18 19:30, Alejandro Piñeiro wrote:
>> On 18/08/18 06:36, Timothy Arceri wrote:
>>> On 18/08/18 14:32, Timothy Arceri wrote:
>>>> Won't this cause shader runner to needlessly parse the .shader_test
>>>> file?
>>
>> True, good point. In any case, as the test lacks a [test] section, full
>> shader.py runs would just check if the test links (assuming that
>> ARB_gl_spirv are available). Having said so ...
>>
>>>
>>> The file extension is also confusing. Maybe we should name these type
>>> of files .shader_source or something similar rather than
>>> .shader_test ???
>>
>> ... this makes sense. That name fits better, and would avoid the
>> previous issue. As that would be a small change, I will make the change
>> locally, while I wait for the review of the other patches.
>
> I've skimmed over most of the series and I didn't see anything other
> than this that I had issue with. It's not very common to get a full
> review for a piglit series. The general rule is once its been on the
> list for a few weeks it's usually ok to push. After all it's better to
> have wrong tests that can be fixed later than to have no tests at all.
>
> I understand the external dependency might have stopped you from just
> pushing but since its an optional dependency it's fine IMO.

Yes, exactly, that was the only reason I didn't push it yet. FWIW, I was
expecting it to be somewhat controversial. But I always tend to be on
the pessimistic/conservative side of things.

>
> Anyway for the series feel free to add:
>
> Acked-by: Timothy Arceri <tarceri@itsqueeze.com>

Ok, thank you very much.

As the series was around several weeks, I think that I will push it as
it is. If the optional dependency causes some issues, at least pushing
it would get the attention of people.

BR