[3/4] arb_gpu_shader5: Add support for testing spirv with XFB streams

Submitted by apinheiro on July 20, 2018, 3:16 p.m.

Details

Message ID 20180720151612.27878-4-apinheiro@igalia.com
State New
Headers show
Series "ARB_gl_spirv: xfb tests" ( rev: 1 ) in Piglit

Not browsing as part of any series.

Commit Message

apinheiro July 20, 2018, 3:16 p.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    | 194 +++++++++++++++++++++
 .../execution/xfb-streams-without-invocations.c    | 135 ++++++++++----
 3 files changed, 297 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 3109a5e34..e4c49e72a 100644
--- a/tests/opengl.py
+++ b/tests/opengl.py
@@ -1951,6 +1951,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..ab798c022
--- /dev/null
+++ b/tests/spec/arb_gpu_shader5/execution/shader_test/xfb_streams_without_invocations.shader_test
@@ -0,0 +1,194 @@ 
+[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. */