Same with this one On Oct 25, 2015 07:08, "Gregory Hainaut" <[email protected]> wrote:
> Test is composed of 2 major steps. > > First part ensure that a matching (same on both VS & FS) qualifier doesn't > pertubate the location assignment > > Second part ensure that a non-matching qualifier also work. Final > interpolation > qualifier is the one of the FS. > Technically it is only allowed from GLSL4.5. However I don't know if any gl > implementation really implement this constraint. > > Signed-off-by: Gregory Hainaut <[email protected]> > --- > .../arb_separate_shader_objects/CMakeLists.gl.txt | 1 + > .../rendezvous_by_name_interpolation.c | 210 > +++++++++++++++++++++ > 2 files changed, 211 insertions(+) > create mode 100644 > tests/spec/arb_separate_shader_objects/rendezvous_by_name_interpolation.c > > diff --git a/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > b/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > index 9ab6606..22a04b7 100644 > --- a/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > +++ b/tests/spec/arb_separate_shader_objects/CMakeLists.gl.txt > @@ -19,5 +19,6 @@ piglit_add_executable > (arb_separate_shader_object-rendezvous_by_location rendezv > piglit_add_executable > (arb_separate_shader_object-rendezvous_by_location-3-stages > rendezvous_by_location-3-stages.c) > piglit_add_executable > (arb_separate_shader_object-rendezvous_by_location-5-stages > rendezvous_by_location-5-stages.c) > piglit_add_executable (arb_separate_shader_object-rendezvous_by_name > rendezvous_by_name.c) > +piglit_add_executable > (arb_separate_shader_object-rendezvous_by_name_interpolation > rendezvous_by_name_interpolation.c) > piglit_add_executable > (arb_separate_shader_object-UseProgramStages-non-separable > UseProgramStages-non-separable.c) > piglit_add_executable (arb_separate_shader_object-ValidateProgramPipeline > ValidateProgramPipeline.c) > diff --git > a/tests/spec/arb_separate_shader_objects/rendezvous_by_name_interpolation.c > b/tests/spec/arb_separate_shader_objects/rendezvous_by_name_interpolation.c > new file mode 100644 > index 0000000..5a99871 > --- /dev/null > +++ > b/tests/spec/arb_separate_shader_objects/rendezvous_by_name_interpolation.c > @@ -0,0 +1,210 @@ > +/* > + * Copyright © 2015 Gregory Hainaut <[email protected]> > + * > + * 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 rendezvous_by_name_interpolation.c > + * Simple test for separate shader objects that use rendezvous-by-name. > + * > + * The test ensures that multiple interpolation qualifier doesn't break > + * the interface matching. > + */ > +#include "piglit-util-gl.h" > + > +PIGLIT_GL_TEST_CONFIG_BEGIN > + > + config.supports_gl_compat_version = 10; > + config.window_visual = PIGLIT_GL_VISUAL_RGB | > PIGLIT_GL_VISUAL_DOUBLE; > + > +PIGLIT_GL_TEST_CONFIG_END > + > +static GLuint pipeline_match[4]; > +static GLuint pipeline_unmatch[4]; > + > +static const char *vs_code_template = > + "#version %d\n" > + "#extension GL_ARB_separate_shader_objects: require\n" > + "#extension GL_ARB_explicit_attrib_location: require\n" > + "\n" > + "layout(location = 0) in vec4 piglit_vertex;\n" > + "\n" > + "%s out vec4 blue;\n" > + "%s out vec4 green;\n" > + "%s out vec4 red;\n" > + "\n" > + "void main()\n" > + "{\n" > + " gl_Position = piglit_vertex;\n" > + " red = vec4(1, 0, 0, 0);\n" > + " green = vec4(0, 1, 0, 0);\n" > + " blue = vec4(0, 0, 1, 0);\n" > + "}\n" > + ; > + > +static const char *fs_code_template = > + "#version %d\n" > + "#extension GL_ARB_separate_shader_objects: require\n" > + "#extension GL_ARB_explicit_attrib_location: enable\n" > + "\n" > + "#if __VERSION__ >= 130\n" > + "layout(location = 0) out vec4 out_color;\n" > + "#else\n" > + "#define out_color gl_FragColor\n" > + "#endif\n" > + "\n" > + "%s in vec4 blue;\n" > + "%s in vec4 green;\n" > + "%s in vec4 red;\n" > + "\n" > + "void main()\n" > + "{\n" > + " out_color = vec4(red.r, green.g, blue.b, 1);\n" > + "}\n" > + ; > + > +static const char *qualifiers[] = { > + "", > + "flat", > + "smooth", > + "noperspective" > +}; > + > +enum piglit_result > +piglit_display(void) > +{ > + static const float expected[] = { > + 1.0f, 1.0f, 1.0f, 1.0f > + }; > + bool pass = true; > + int i; > + > + glClearColor(0.1f, 0.1f, 0.1f, 0.1f); > + glClear(GL_COLOR_BUFFER_BIT); > + > + for (i = 0; i < 4; i++) { > + float w = 0.5; > + float x = -1.0 + w * i; > + /* > + * Match qualifier on bottom row > + */ > + glBindProgramPipeline(pipeline_match[i]); > + piglit_draw_rect(x, -1, w, 1); > + > + /* > + * Unmatch qualifier on top row > + */ > + glBindProgramPipeline(pipeline_unmatch[i]); > + piglit_draw_rect(x, 0, w, 1); > + } > + > + pass &= piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, > + expected); > + > + piglit_present_results(); > + > + return pass ? PIGLIT_PASS : PIGLIT_FAIL; > +} > + > +GLuint format_and_link_program(GLenum type, const char* code, unsigned > glsl_version, > + unsigned q1, unsigned q2, unsigned q3) > +{ > + char *source; > + GLuint prog; > + > + asprintf(&source, code, glsl_version, qualifiers[q1], > qualifiers[q2], qualifiers[q3]); > + prog = glCreateShaderProgramv(type, 1, > + (const GLchar *const *) &source); > + > + piglit_link_check_status(prog); > + free(source); > + > + return prog; > +} > + > +void piglit_init(int argc, char **argv) > +{ > + unsigned i; > + unsigned glsl_version; > + GLuint vs_prog[4]; > + GLuint fs_prog_match[4]; > + GLuint fs_prog_unmatch[4]; > + bool es; > + int glsl_major; > + int glsl_minor; > + > + piglit_require_vertex_shader(); > + piglit_require_fragment_shader(); > + piglit_require_GLSL_version(130); /* Support layout index on > output color */ > + piglit_require_extension("GL_ARB_separate_shader_objects"); > + piglit_require_extension("GL_ARB_explicit_attrib_location"); > + piglit_require_extension("GL_ARB_blend_func_extended"); > + > + /* Some NVIDIA drivers have issues with layout qualifiers, 'in' > + * keywords, and 'out' keywords in "lower" GLSL versions. If the > + * driver supports GLSL >= 1.40, use 1.40. Otherwise, pick the > + * highest version that the driver supports. > + */ > + piglit_get_glsl_version(&es, &glsl_major, &glsl_minor); > + glsl_version = ((glsl_major * 100) + glsl_minor) >= 140 > + ? 140 : ((glsl_major * 100) + glsl_minor); > + > + /* > + * Program compilation and link > + */ > + for (i = 0; i < 4; i++) { > + int next = (i+1) % 4; > + int prev = (i-1) % 4; > + printf("Compile vs_prog[%d]\n", i); > + vs_prog[i] = format_and_link_program(GL_VERTEX_SHADER, > + vs_code_template, glsl_version, prev, i, > next); > + > + printf("Compile fs_prog_match[%d]\n", i); > + fs_prog_match[i] = > format_and_link_program(GL_FRAGMENT_SHADER, > + fs_code_template, glsl_version, prev, i, > next); > + > + printf("Compile fs_prog_unmatch[%d]\n", i); > + fs_prog_unmatch[i] = > format_and_link_program(GL_FRAGMENT_SHADER, > + fs_code_template, glsl_version, next, > prev, i); > + } > + > + /* > + * Pipeline creation > + */ > + glGenProgramPipelines(4, pipeline_match); > + glGenProgramPipelines(4, pipeline_unmatch); > + for (i = 0; i < 4; i++) { > + glBindProgramPipeline(pipeline_match[i]); > + glUseProgramStages(pipeline_match[i], > + GL_VERTEX_SHADER_BIT, vs_prog[i]); > + glUseProgramStages(pipeline_match[i], > + GL_FRAGMENT_SHADER_BIT, fs_prog_match[i]); > + > + glBindProgramPipeline(pipeline_unmatch[i]); > + glUseProgramStages(pipeline_unmatch[i], > + GL_VERTEX_SHADER_BIT, vs_prog[i]); > + glUseProgramStages(pipeline_unmatch[i], > + GL_FRAGMENT_SHADER_BIT, > fs_prog_unmatch[i]); > + } > + > + if (!piglit_check_gl_error(0)) > + piglit_report_result(PIGLIT_FAIL); > +} > -- > 2.1.4 > > _______________________________________________ > Piglit mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/piglit >
_______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
