[Mesa-dev] [PATCH] gl-2.0: Add test for re-using shader objects

Ilia Mirkin imirkin at alum.mit.edu
Fri Jun 26 07:54:48 PDT 2015


On Fri, Jun 26, 2015 at 10:50 AM, Topi Pohjolainen
<topi.pohjolainen at intel.com> wrote:
> This is stimulating the shader binary re-use logic in i965 buffer
> object uploading. Without relaxing the current constraints there
> will be two identical copies in the cache. With the introduced
> three patches the logic begins to share only one copy between
> two entries in the cache.
>
> CC: Kenneth Graunke <kenneth at whitecape.org>
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
>  tests/spec/gl-2.0/CMakeLists.gl.txt       |   1 +
>  tests/spec/gl-2.0/reuse_fragment_shader.c | 105 ++++++++++++++++++++++++++++++

also add to all.py?

>  2 files changed, 106 insertions(+)
>  create mode 100644 tests/spec/gl-2.0/reuse_fragment_shader.c
>
> diff --git a/tests/spec/gl-2.0/CMakeLists.gl.txt b/tests/spec/gl-2.0/CMakeLists.gl.txt
> index 2ce99bd..54d420f 100644
> --- a/tests/spec/gl-2.0/CMakeLists.gl.txt
> +++ b/tests/spec/gl-2.0/CMakeLists.gl.txt
> @@ -15,3 +15,4 @@ piglit_add_executable (gl-2.0-edgeflag edgeflag.c)
>  piglit_add_executable (gl-2.0-edgeflag-immediate edgeflag-immediate.c)
>  piglit_add_executable (gl-2.0-vertexattribpointer vertexattribpointer.c)
>  piglit_add_executable (gl-2.0-vertex-const-attr vertex-const-attr.c)
> +piglit_add_executable (gl-2.0-reuse_fragment_shader reuse_fragment_shader.c)
> diff --git a/tests/spec/gl-2.0/reuse_fragment_shader.c b/tests/spec/gl-2.0/reuse_fragment_shader.c
> new file mode 100644
> index 0000000..bf10425
> --- /dev/null
> +++ b/tests/spec/gl-2.0/reuse_fragment_shader.c
> @@ -0,0 +1,105 @@
> +/* Copyright © 2015 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 reuse_fragment_shader.c
> + *
> + * Compile and run two programs that use the same vertex and fragment
> + * shader objects.
> + *
> + * The spec says: "It is also permissible to attach a shader object to more
> + *                 than one program object."
> + */
> +
> +#include "piglit-util-gl.h"
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +       config.supports_gl_compat_version = 10;
> +
> +       config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static const float green[] = {0, 1, 0, 0};
> +static const float blue[] = {0, 0, 1, 0};
> +
> +static GLint prog_1;
> +static GLint prog_2;
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +       bool pass = true;
> +
> +       glUseProgram(prog_2);
> +       piglit_draw_rect(-1, -1, 1, 2);
> +
> +       glUseProgram(prog_1);
> +       piglit_draw_rect(0, -1, 1, 2);
> +
> +       pass = piglit_probe_rect_rgba(
> +                       0, 0, piglit_width / 2, piglit_height, green);
> +       pass = piglit_probe_rect_rgba(
> +                       piglit_width / 2, 0,
> +                       piglit_width / 2, piglit_height, blue) && pass;
> +       piglit_present_results();
> +
> +       return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +static const char *vs_source =
> +       "void main()\n"
> +       "{\n"
> +       "       gl_Position = gl_Vertex;\n"
> +       "}\n";
> +
> +static const char *fs_source =
> +       "uniform vec4 color;\n"
> +       "\n"
> +       "void main()\n"
> +       "{\n"
> +       "       gl_FragColor = color;\n"
> +       "}\n";
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +       const GLuint fs = piglit_compile_shader_text(GL_FRAGMENT_SHADER,
> +                                                    fs_source);
> +       const GLuint vs = piglit_compile_shader_text(GL_VERTEX_SHADER,
> +                                                    vs_source);
> +       GLint color_loc_prog_1;
> +       GLint color_loc_prog_2;
> +
> +       prog_1 = piglit_link_simple_program(vs, fs);
> +       glUseProgram(prog_1);
> +       color_loc_prog_1 = glGetUniformLocation(prog_1, "color");
> +       glUniform4fv(color_loc_prog_1, 1, blue);
> +
> +       prog_2 = piglit_link_simple_program(vs, fs);
> +       glUseProgram(prog_2);
> +       color_loc_prog_2 = glGetUniformLocation(prog_2, "color");
> +       glUniform4fv(color_loc_prog_2, 1, green);
> +
> +       glDeleteShader(vs);
> +       glDeleteShader(fs);
> +}
> --
> 1.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list