[Piglit] [PATCH] arb_gpu_shader_fp64: Add tests to check float to double conversion under non-uniform control flow
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Mon Oct 17 05:51:00 UTC 2016
On 14/10/16 11:22, Nicolai Hähnle wrote:
> On 13.10.2016 11:45, Samuel Iglesias Gonsálvez wrote:
>> We found issues with this case while developing i965's Ivybridge patches
>> to support arb_gpu_shader_fp64.
>>
>> Signed-off-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
>> ---
>> tests/all.py | 2 +
>> tests/spec/arb_gpu_shader_fp64/CMakeLists.gl.txt | 2 +
>> .../fs-non-uniform-control-flow-f2d.c | 135
>> +++++++++++++++++
>> .../vs-non-uniform-control-flow-f2d.c | 166
>> +++++++++++++++++++++
>
> Couldn't this work as a shader_test? I wouldn't insist on that, but
> especially with the recent upgrade of shader_runner, that's generally
> preferable.
>
Right. I will do it, please ignore this patch.
>
>> 4 files changed, 305 insertions(+)
>> create mode 100644
>> tests/spec/arb_gpu_shader_fp64/fs-non-uniform-control-flow-f2d.c
>> create mode 100644
>> tests/spec/arb_gpu_shader_fp64/vs-non-uniform-control-flow-f2d.c
>>
>> diff --git a/tests/all.py b/tests/all.py
>> index 6d5826c..fec7137 100644
>> --- a/tests/all.py
>> +++ b/tests/all.py
>> @@ -2211,6 +2211,8 @@ with profile.group_manager(
>> g(['arb_gpu_shader_fp64-fs-non-uniform-control-flow-alu'])
>> g(['arb_gpu_shader_fp64-vs-non-uniform-control-flow-packing'])
>> g(['arb_gpu_shader_fp64-fs-non-uniform-control-flow-packing'])
>> + g(['arb_gpu_shader_fp64-vs-non-uniform-control-flow-f2d'])
>> + g(['arb_gpu_shader_fp64-fs-non-uniform-control-flow-f2d'])
>>
>> with profile.group_manager(
>> PiglitGLTest,
>> diff --git a/tests/spec/arb_gpu_shader_fp64/CMakeLists.gl.txt
>> b/tests/spec/arb_gpu_shader_fp64/CMakeLists.gl.txt
>> index 209442f..d9f5dd5 100644
>> --- a/tests/spec/arb_gpu_shader_fp64/CMakeLists.gl.txt
>> +++ b/tests/spec/arb_gpu_shader_fp64/CMakeLists.gl.txt
>> @@ -19,3 +19,5 @@ piglit_add_executable
>> (arb_gpu_shader_fp64-fs-non-uniform-control-flow-alu fs-no
>> piglit_add_executable
>> (arb_gpu_shader_fp64-vs-non-uniform-control-flow-alu
>> vs-non-uniform-control-flow-alu.c)
>> piglit_add_executable
>> (arb_gpu_shader_fp64-fs-non-uniform-control-flow-packing
>> fs-non-uniform-control-flow-packing.c)
>> piglit_add_executable
>> (arb_gpu_shader_fp64-vs-non-uniform-control-flow-packing
>> vs-non-uniform-control-flow-packing.c)
>> +piglit_add_executable
>> (arb_gpu_shader_fp64-fs-non-uniform-control-flow-f2d
>> fs-non-uniform-control-flow-f2d.c)
>> +piglit_add_executable
>> (arb_gpu_shader_fp64-vs-non-uniform-control-flow-f2d
>> vs-non-uniform-control-flow-f2d.c)
>> diff --git
>> a/tests/spec/arb_gpu_shader_fp64/fs-non-uniform-control-flow-f2d.c
>> b/tests/spec/arb_gpu_shader_fp64/fs-non-uniform-control-flow-f2d.c
>> new file mode 100644
>> index 0000000..b701dd0
>> --- /dev/null
>> +++ b/tests/spec/arb_gpu_shader_fp64/fs-non-uniform-control-flow-f2d.c
>> @@ -0,0 +1,135 @@
>> +/*
>> + * Copyright © 2016 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person
>> obtaining a
>> + * copy of this software and associated documentation files (the
>> "Software"),
>> + * to deal in the Software without restriction, including without
>> limitation
>> + * the rights to use, copy, modify, merge, publish, distribute,
>> sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including
>> the next
>> + * paragraph) shall be included in all copies or substantial portions
>> of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
>> SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
>> OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>> + * DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +/** @file fs-non-uniform-control-flow-f2d.c
>> + *
>> + * It checks that a float to double conversion works correctly when
>> it is
>> + * under non-uniform control flow.
>> + */
>> +
>> +#include "piglit-util-gl.h"
>> +
>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>> + config.window_width = 62;
>> + config.window_height = 62;
>
> I remember something about small window sizes being a problem on
> Windows. Did the exact window size matter for the driver bug? The rest
> of the test looks like it should be window size agnostic. (The same for
> the second test.)
It doesn't matter for the bug. I will fix this.
>
> Apart from that:
>
> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
Thanks for the review!
Sam
>
>> + config.supports_gl_compat_version = 32;
>> + config.supports_gl_core_version = 32;
>> + config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
>> PIGLIT_GL_VISUAL_RGBA;
>> +PIGLIT_GL_TEST_CONFIG_END
>> +
>> +static const char vs_pass_thru_text[] =
>> + "#version 130\n"
>> + "\n"
>> + "in vec4 piglit_vertex;\n"
>> + "void main() {\n"
>> + " gl_Position = piglit_vertex;\n"
>> + "}\n";
>> +
>> +static const char fs_source[] =
>> + "#version 330\n"
>> + "#extension GL_ARB_gpu_shader_fp64 : require\n"
>> + "\n"
>> + "out vec4 color;\n"
>> + "\n"
>> + "void main() {\n"
>> + " int cx = int(gl_FragCoord.x) / 31;\n"
>> + " int cy = int(gl_FragCoord.y) / 31;\n"
>> + " dvec2 rg; \n"
>> + " vec2 value;\n"
>> + " if ((cx + cy) % 2 == 0)\n"
>> + " value = vec2(1.0f, 0.0f);\n"
>> + " else\n"
>> + " value = vec2(0.0f, 1.0f);\n"
>> + " rg = dvec2(value); \n"
>> + " if (rg == dvec2(0, 1))\n"
>> + " color = vec4(0, 0, 1, 1);\n"
>> + " else\n"
>> + " color = vec4(rg, 0, 1);\n"
>> + "}\n";
>> +
>> +GLuint prog, fbo;
>> +
>> +void
>> +piglit_init(int argc, char **argv)
>> +{
>> + GLuint buffer;
>> +
>> + piglit_require_GLSL_version(330);
>> + piglit_require_extension("GL_ARB_gpu_shader_fp64");
>> +
>> + prog = piglit_build_simple_program(vs_pass_thru_text, fs_source);
>> +
>> + glUseProgram(prog);
>> +
>> + glClearColor(0, 0, 0, 1);
>> +
>> + if (!piglit_check_gl_error(GL_NO_ERROR))
>> + piglit_report_result(PIGLIT_FAIL);
>> +}
>> +
>> +enum piglit_result piglit_display(void)
>> +{
>> + bool pass = true;
>> + const int num_pixels = piglit_width * piglit_height;
>> + float *srcPixels = malloc(num_pixels * 4 * sizeof(float));
>> + float expected[4];
>> + int i, j;
>> +
>> + glViewport(0, 0, piglit_width, piglit_height);
>> + glUseProgram(prog);
>> + glClear(GL_COLOR_BUFFER_BIT);
>> +
>> + piglit_draw_rect(-1, -1, 2, 2);
>> +
>> + glReadPixels(0, 0, piglit_width, piglit_height,
>> + GL_RGBA, GL_FLOAT, srcPixels);
>> +
>> + /* Verify */
>> + for (i = 0; i < piglit_height; i++) {
>> + for (j = 0; j < piglit_width; j++) {
>> + int cx = j / 31;
>> + int cy = i / 31;
>> + int pos = (i * piglit_width + j) * 4;
>> + if ((cx + cy) % 2 != 0) {
>> + expected[0] = 0.0;
>> + expected[1] = 0.0;
>> + expected[2] = 1.0;
>> + expected[3] = 1.0;
>> + } else {
>> + expected[0] = 1.0;
>> + expected[1] = 0.0;
>> + expected[2] = 0.0;
>> + expected[3] = 1.0;
>> + }
>> +
>> + pass = piglit_compare_pixels(j, i, expected,
>> + srcPixels + pos,
>> + piglit_tolerance,
>> + 4) && pass;
>> + }
>> + }
>> + piglit_present_results();
>> + free(srcPixels);
>> +
>> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>> +}
>> diff --git
>> a/tests/spec/arb_gpu_shader_fp64/vs-non-uniform-control-flow-f2d.c
>> b/tests/spec/arb_gpu_shader_fp64/vs-non-uniform-control-flow-f2d.c
>> new file mode 100644
>> index 0000000..94af02c
>> --- /dev/null
>> +++ b/tests/spec/arb_gpu_shader_fp64/vs-non-uniform-control-flow-f2d.c
>> @@ -0,0 +1,166 @@
>> +/*
>> + * Copyright © 2016 Intel Corporation
>> + *
>> + * Permission is hereby granted, free of charge, to any person
>> obtaining a
>> + * copy of this software and associated documentation files (the
>> "Software"),
>> + * to deal in the Software without restriction, including without
>> limitation
>> + * the rights to use, copy, modify, merge, publish, distribute,
>> sublicense,
>> + * and/or sell copies of the Software, and to permit persons to whom the
>> + * Software is furnished to do so, subject to the following conditions:
>> + *
>> + * The above copyright notice and this permission notice (including
>> the next
>> + * paragraph) shall be included in all copies or substantial portions
>> of the
>> + * Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>> EXPRESS OR
>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY,
>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
>> SHALL
>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
>> OR OTHER
>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>> ARISING
>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>> + * DEALINGS IN THE SOFTWARE.
>> + */
>> +
>> +/** @file vs-non-uniform-control-flow-f2d.c
>> + *
>> + * It checks that a float to double conversion works correctly when
>> it is
>> + * under non-uniform control flow.
>> + */
>> +
>> +#include "piglit-util-gl.h"
>> +
>> +PIGLIT_GL_TEST_CONFIG_BEGIN
>> + config.window_width = 62;
>> + config.window_height = 62;
>> + config.supports_gl_compat_version = 32;
>> + config.supports_gl_core_version = 32;
>> + config.window_visual = PIGLIT_GL_VISUAL_DOUBLE |
>> PIGLIT_GL_VISUAL_RGBA;
>> +PIGLIT_GL_TEST_CONFIG_END
>> +
>> +static const char vs_source[] =
>> + "#version 330\n"
>> + "#extension GL_ARB_gpu_shader_fp64 : require\n"
>> + "\n"
>> + "out vec4 color;\n"
>> + "\n"
>> + "layout(location = 0) in vec3 inVertexPosition;\n"
>> + "\n"
>> + "void main() {\n"
>> + " gl_Position = vec4(inVertexPosition, 1);\n"
>> + " dvec2 rg; \n"
>> + " vec2 value;\n"
>> + " if (inVertexPosition.x < 0 && inVertexPosition.y < 0)\n"
>> + " value = vec2(1.0f, 0.0f);\n"
>> + " else\n"
>> + " value = vec2(0.0f, 1.0f);\n"
>> + " rg = dvec2(value); \n"
>> + " if (rg == dvec2(0, 1))\n"
>> + " color = vec4(0, 0, 1, 1);\n"
>> + " else\n"
>> + " color = vec4(rg, 0, 1);\n"
>> + "}\n";
>> +
>> +static const char fs_source[] =
>> + "#version 130\n"
>> + "\n"
>> + "in vec4 color;\n"
>> + "out vec4 frag_color;\n"
>> + "\n"
>> + "void main() {\n"
>> + " frag_color = color;\n"
>> + "}\n";
>> +
>> +static GLuint prog, vertexArrayID;
>> +static GLuint fb, rb;
>> +
>> +void
>> +piglit_init(int argc, char **argv)
>> +{
>> + GLuint vertexBuffer;
>> + // Vertex data
>> + static const GLfloat vertexData[4 * 3] = {
>> + -1.0f, -1.0f, -1.0f,
>> + 1.0f, -1.0f, -1.0f,
>> + -1.0f, 1.0f, -1.0f,
>> + 1.0f, 1.0f, -1.0f,
>> + };
>> +
>> + piglit_require_extension("GL_ARB_gpu_shader_fp64");
>> +
>> + piglit_require_GLSL_version(330);
>> +
>> + prog = piglit_build_simple_program(vs_source, fs_source);
>> + glUseProgram(prog);
>> +
>> + glClearColor(0, 0, 0, 1);
>> + glPointSize(10.0);
>> +
>> + glGenRenderbuffers(1, &rb);
>> + glBindRenderbuffer(GL_RENDERBUFFER, rb);
>> + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA,
>> + piglit_width, piglit_height);
>> +
>> + glGenFramebuffers(1, &fb);
>> + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
>> + glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
>> + GL_RENDERBUFFER, rb);
>> +
>> + // Record vertex data and attributes in a VAO
>> + glGenVertexArrays(1, &vertexArrayID);
>> + glBindVertexArray(vertexArrayID);
>> + // Upload vertex position data to a VBO
>> + glGenBuffers(1, &vertexBuffer);
>> + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
>> + glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData),
>> + vertexData, GL_STATIC_DRAW);
>> +
>> + // Bind vertex position VBO to vertex shader attribute index 0
>> + glEnableVertexAttribArray(0);
>> + glVertexAttribPointer(
>> + 0, // attribute index
>> + 3, // size
>> + GL_FLOAT, // type
>> + GL_FALSE, // normalized?
>> + 0, // stride
>> + (void*)0 // buffer offset
>> + );
>> +
>> + glBindBuffer(GL_ARRAY_BUFFER, 0);
>> + // Unbind VAO
>> + glBindVertexArray(0);
>> + // Disable attribute arrays
>> + glDisableVertexAttribArray(0);
>> +
>> + if (!piglit_check_gl_error(GL_NO_ERROR))
>> + piglit_report_result(PIGLIT_FAIL);
>> +}
>> +
>> +enum piglit_result piglit_display(void)
>> +{
>> + bool pass = true;
>> + float red[4] = {1.0, 0.0, 0.0, 1.0};
>> + float blue[4] = {0.0, 0.0, 1.0, 1.0};
>> +
>> + glUseProgram(prog);
>> + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
>> + glViewport(0, 0, piglit_width, piglit_height);
>> +
>> + glClear(GL_COLOR_BUFFER_BIT);
>> + glBindVertexArray(vertexArrayID);
>> + glDrawArrays(GL_POINTS, 0, 4);
>> + glBindVertexArray(0);
>> +
>> + glBindFramebuffer(GL_READ_FRAMEBUFFER, fb);
>> +
>> + /* Verify */
>> + pass = piglit_probe_pixel_rgba(0, 0, red) && pass;
>> + pass = piglit_probe_pixel_rgba(0, piglit_height - 1, blue) && pass;
>> + pass = piglit_probe_pixel_rgba(piglit_width - 1,
>> + piglit_height - 1, blue) && pass;
>> + pass = piglit_probe_pixel_rgba(piglit_width - 1, 0, blue) && pass;
>> +
>> + pass = piglit_check_gl_error(GL_NO_ERROR) && pass;
>> + piglit_present_results();
>> +
>> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
>> +}
>>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/piglit/attachments/20161017/725787f4/attachment.sig>
More information about the Piglit
mailing list