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

Alejandro Piñeiro apinheiro at igalia.com
Sat Aug 18 09:30:51 UTC 2018


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 at 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 at igalia.com>
>>> Signed-off-by: Alejandro Piñeiro <apinheiro at 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 at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/piglit
>



More information about the Piglit mailing list