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 <nrobe...@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 <nrobe...@igalia.com> >>> Signed-off-by: Alejandro Piñeiro <apinhe...@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 > _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit