From: Neil Roberts <nrobe...@igalia.com>

v2: use shader_test file with the spirv assembly, instead of include a
    SPIR-V binary binaries (Alejandro Piñeiro)

Signed-off-by: Neil Roberts <nrobe...@igalia.com>
Signed-off-by: Alejandro Piñeiro <apinhe...@igalia.com>
---
 tests/opengl.py                                    |   2 +-
 .../shader_test/vs_double.shader_test              | 102 +++++++++++++++++++++
 .../transform-feedback-layout-qualifiers.c         |  99 ++++++++++++++++----
 3 files changed, 184 insertions(+), 19 deletions(-)
 create mode 100644 
tests/spec/arb_enhanced_layouts/shader_test/vs_double.shader_test

diff --git a/tests/opengl.py b/tests/opengl.py
index 0b06d9505..b021b2a9e 100644
--- a/tests/opengl.py
+++ b/tests/opengl.py
@@ -2308,7 +2308,7 @@ with profile.test_list.group_manager(
        'explicit-offset-bufferstorage')
     g(['arb_enhanced_layouts-gs-stream-location-aliasing'],
        'gs-stream-location-aliasing')
-    for test in ['vs', 'vs_ifc', 'vs_named_ifc', 'vs_struct']:
+    for test in ['vs', 'vs_ifc', 'vs_named_ifc', 'vs_struct', 'vs_double']:
         g(['arb_enhanced_layouts-transform-feedback-layout-qualifiers', test],
           'arb_enhanced_layouts-transform-feedback-layout-qualifiers_' + test,
           run_concurrent=False)
diff --git a/tests/spec/arb_enhanced_layouts/shader_test/vs_double.shader_test 
b/tests/spec/arb_enhanced_layouts/shader_test/vs_double.shader_test
new file mode 100644
index 000000000..6f19d0d13
--- /dev/null
+++ b/tests/spec/arb_enhanced_layouts/shader_test/vs_double.shader_test
@@ -0,0 +1,102 @@
+[require]
+SPIRV YES
+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: 41
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float64
+               OpCapability TransformFeedback
+          %1 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %main "main" %_ %x1_out %x2_out %x3_out 
%gl_VertexID %gl_InstanceID
+               OpExecutionMode %main Xfb
+               OpSource GLSL 450
+               OpSourceExtension "GL_ARB_enhanced_layouts"
+               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 %_ XfbBuffer 0
+               OpDecorate %_ XfbStride 56
+               OpDecorate %x1_out Location 0
+               OpDecorate %x1_out XfbBuffer 0
+               OpDecorate %x1_out XfbStride 56
+               OpDecorate %x1_out Offset 0
+               OpDecorate %x2_out Location 1
+               OpDecorate %x2_out XfbBuffer 0
+               OpDecorate %x2_out XfbStride 56
+               OpDecorate %x2_out Offset 8
+               OpDecorate %x3_out Location 2
+               OpDecorate %x3_out XfbBuffer 0
+               OpDecorate %x3_out XfbStride 56
+               OpDecorate %x3_out Offset 24
+               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
+     %double = OpTypeFloat 64
+%_ptr_Output_double = OpTypePointer Output %double
+     %x1_out = OpVariable %_ptr_Output_double Output
+   %double_1 = OpConstant %double 1
+   %v2double = OpTypeVector %double 2
+%_ptr_Output_v2double = OpTypePointer Output %v2double
+     %x2_out = OpVariable %_ptr_Output_v2double Output
+   %double_2 = OpConstant %double 2
+   %double_3 = OpConstant %double 3
+         %29 = OpConstantComposite %v2double %double_2 %double_3
+   %v4double = OpTypeVector %double 4
+%_ptr_Output_v4double = OpTypePointer Output %v4double
+     %x3_out = OpVariable %_ptr_Output_v4double Output
+   %double_4 = OpConstant %double 4
+   %double_5 = OpConstant %double 5
+   %double_6 = OpConstant %double 6
+   %double_7 = OpConstant %double 7
+         %37 = OpConstantComposite %v4double %double_4 %double_5 %double_6 
%double_7
+%_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
+               OpStore %x1_out %double_1
+               OpStore %x2_out %29
+               OpStore %x3_out %37
+               OpReturn
+               OpFunctionEnd
+
+[vertex shader]
+#version 450
+#extension GL_ARB_enhanced_layouts: require
+
+layout(location = 0, xfb_offset = 0) out double x1_out;
+layout(location = 1, xfb_offset = 8) out dvec2 x2_out;
+layout(location = 2, xfb_offset = 24) out dvec4 x3_out;
+
+void main() {
+        gl_Position = vec4(0.0);
+        x1_out = 1.0lf;
+        x2_out = dvec2(2.0lf, 3.0lf);
+        x3_out = dvec4(4.0lf, 5.0lf, 6.0lf, 7.0lf);
+}
diff --git 
a/tests/spec/arb_enhanced_layouts/transform-feedback-layout-qualifiers.c 
b/tests/spec/arb_enhanced_layouts/transform-feedback-layout-qualifiers.c
index a18b95ccd..d95fd3536 100644
--- a/tests/spec/arb_enhanced_layouts/transform-feedback-layout-qualifiers.c
+++ b/tests/spec/arb_enhanced_layouts/transform-feedback-layout-qualifiers.c
@@ -46,6 +46,8 @@ static const char vs_pass_thru_text[] =
 
 #define VS_TWO_SETS_STRUCT_NAME "vs_two_sets_struct.shader_test"
 
+#define VS_DOUBLE_NAME "vs_double.shader_test"
+
 static const char gs_text_two_sets_tmpl[] =
        "#version 150\n"
        "#extension GL_ARB_enhanced_layouts: require\n"
@@ -81,10 +83,12 @@ struct test_config {
        const char *shader_test_filename;
        bool spirv;
        GLint gs_invocation_n;
+       bool doubles;
 };
 
 #define BUF_1_FLOAT_N 6
 #define BUF_2_FLOAT_N 5
+#define BUF_DOUBLE_N 7
 
 
 static void
@@ -96,6 +100,7 @@ print_usage_and_exit(const char *prog_name)
               "    vs_ifc (vertex shader only, with interface block)\n"
               "    vs_named_ifc (vertex shader only, with named interface 
block)\n"
               "    vs_struct (vertex shader only, with structs)\n"
+              "    vs_double (vertex shader only, using doubles)\n"
               "    gs (with geometry shader invoked once per stage)\n"
               "    gs_max (with geometry shader invoked max times per "
               "stage)\n"
@@ -191,17 +196,11 @@ build_and_use_program(const struct test_config *config)
        glUseProgram(prog);
 }
 
-static bool
-probe_buffers(const GLuint *xfb, const GLuint *queries, unsigned primitive_n)
+static void
+probe_queries(const GLuint *queries,
+             unsigned primitive_n)
 {
-       bool pass;
-       unsigned i;
        GLuint query_result;
-       float *first;
-       float *second;
-
-       const unsigned first_n = primitive_n * BUF_1_FLOAT_N;
-       const unsigned second_n = primitive_n * BUF_2_FLOAT_N;
 
        glGetQueryObjectuiv(queries[0], GL_QUERY_RESULT, &query_result);
        if (query_result != primitive_n) {
@@ -216,6 +215,20 @@ probe_buffers(const GLuint *xfb, const GLuint *queries, 
unsigned primitive_n)
                        primitive_n, query_result);
                piglit_report_result(PIGLIT_FAIL);
        }
+}
+
+
+static bool
+probe_buffers_float(const GLuint *xfb,
+                   unsigned primitive_n)
+{
+       bool pass;
+       unsigned i;
+       float *first;
+       float *second;
+
+       const unsigned first_n = primitive_n * BUF_1_FLOAT_N;
+       const unsigned second_n = primitive_n * BUF_2_FLOAT_N;
 
        first = malloc(first_n * sizeof(float));
        second = malloc(second_n * sizeof(float));
@@ -247,6 +260,31 @@ probe_buffers(const GLuint *xfb, const GLuint *queries, 
unsigned primitive_n)
        return pass;
 }
 
+static bool
+probe_buffers_double(const GLuint *xfb,
+                    unsigned primitive_n)
+{
+       bool pass;
+       unsigned i, j;
+       double *first;
+
+       const unsigned first_n = primitive_n * BUF_DOUBLE_N;
+
+       first = malloc(first_n * sizeof(double));
+
+       for (i = 0; i < primitive_n; ++i) {
+               for (j = 0; j < BUF_DOUBLE_N; j++)
+                       first[i * BUF_DOUBLE_N + j] = i + j + 1;
+       }
+
+       pass = piglit_probe_buffer_doubles(xfb[0], GL_TRANSFORM_FEEDBACK_BUFFER,
+                                          "first", 1, first_n, first);
+
+       free(first);
+
+       return pass;
+}
+
 static void
 parse_args(int argc, char **argv, struct test_config *config)
 {
@@ -256,36 +294,49 @@ parse_args(int argc, char **argv, struct test_config 
*config)
                const char *name;
                const char *shader_test_filename;
                unsigned gs_invocation_n;
+               bool doubles;
        } test_types[] = {
                {
                        "vs",
                        "vs_two_sets.shader_test",
-                       0
+                       0,
+                       false
                },
                {
                        "vs_ifc",
                        "vs_two_sets_ifc.shader_test",
-                       0
+                       0,
+                       false
                },
                {
                        "vs_named_ifc",
                        "vs_two_sets_named_ifc.shader_test",
-                       0
+                       0,
+                       false
                },
                {
                        "vs_struct",
                        "vs_two_sets_struct.shader_test",
-                       0
+                       0,
+                       false
+               },
+               {
+                       "vs_double",
+                       "vs_double.shader_test",
+                       0,
+                       true,
                },
                {
                        "gs",
                        NULL,
-                       1
+                       1,
+                       false
                },
                {
                        "gs_max",
                        NULL,
-                       INT_MAX
+                       INT_MAX,
+                       false
                }
        };
 
@@ -298,6 +349,8 @@ parse_args(int argc, char **argv, struct test_config 
*config)
                                        test_types[j].shader_test_filename,
                                config->gs_invocation_n =
                                        test_types[j].gs_invocation_n;
+                               config->doubles =
+                                       test_types[j].doubles;
                                option_was_handled = true;
                                goto option_handled;
                        }
@@ -356,6 +409,9 @@ piglit_init(int argc, char **argv)
                }
        }
 
+       if (config.doubles)
+          piglit_require_GLSL_version(450);
+
        /* Zero invocations means the feedback is produced by vertex shader */
        primitive_n = config.gs_invocation_n ? config.gs_invocation_n : 1;
 
@@ -365,8 +421,11 @@ piglit_init(int argc, char **argv)
        glGenBuffers(ARRAY_SIZE(xfb), xfb);
        glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfb[0]);
        glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,
-               primitive_n * BUF_1_FLOAT_N * sizeof(float), NULL,
-               GL_STREAM_READ);
+                    primitive_n *
+                    MAX2(BUF_1_FLOAT_N * sizeof(float),
+                         BUF_DOUBLE_N * sizeof(double)),
+                    NULL,
+                    GL_STREAM_READ);
        glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 2, xfb[1]);
        glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER,
                primitive_n * BUF_2_FLOAT_N * sizeof(float), NULL,
@@ -397,7 +456,11 @@ piglit_init(int argc, char **argv)
        if (!piglit_check_gl_error(GL_NO_ERROR))
                piglit_report_result(PIGLIT_FAIL);
 
-       pass = probe_buffers(xfb, queries, primitive_n);
+       probe_queries(queries, primitive_n);
+       if (config.doubles)
+               pass = probe_buffers_double(xfb, primitive_n);
+       else
+               pass = probe_buffers_float(xfb, primitive_n);
 
        glDeleteBuffers(2, xfb);
        glDeleteQueries(2, queries);
-- 
2.14.1

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to