[Piglit] [PATCH 14/16] namespace-pollution: Add vertex program as an object to test

Ilia Mirkin imirkin at alum.mit.edu
Wed Jan 6 19:51:07 PST 2016


Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>

On Wed, Jan 6, 2016 at 7:53 PM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> NOTE: The following tests fail on i965 (and presumably other drivers
> that use meta) on Mesa master and 11.1:
>
>     program with gldrawpixels
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92363
> ---
>  tests/all.py                               |   2 +-
>  tests/general/object-namespace-pollution.c | 213 +++++++++++++++++++++++++++++
>  2 files changed, 214 insertions(+), 1 deletion(-)
>
> diff --git a/tests/all.py b/tests/all.py
> index e477cd8..9169699 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -4608,7 +4608,7 @@ with profile.group_manager(
>  with profile.group_manager(
>          PiglitGLTest,
>          grouptools.join('object namespace pollution')) as g:
> -    for object_type in ("buffer", "framebuffer", "renderbuffer", "texture"):
> +    for object_type in ("buffer", "framebuffer", "program", "renderbuffer", "texture"):
>          for operation in ("glBitmap", "glBlitFramebuffer", "glClear", "glClearTexSubImage", "glCopyImageSubData", "glCopyPixels", "glCopyTexSubImage2D", "glDrawPixels", "glGenerateMipmap", "glGetTexImage", "glGetTexImage-compressed", "glTexSubImage2D"):
>              g(['object-namespace-pollution', operation, object_type],
>                '{} with {}'.format(object_type, operation))
> diff --git a/tests/general/object-namespace-pollution.c b/tests/general/object-namespace-pollution.c
> index 1073b65..f99328a 100644
> --- a/tests/general/object-namespace-pollution.c
> +++ b/tests/general/object-namespace-pollution.c
> @@ -353,6 +353,218 @@ validate_framebuffer(unsigned name)
>  }
>  /*@}*/
>
> +/** \name Methods for operating on vertex or fragment program objects */
> +/*@{*/
> +static char *
> +generate_program_source(GLenum target, unsigned key)
> +{
> +       char *source = NULL;
> +
> +       if (target == GL_VERTEX_PROGRAM_ARB) {
> +               const char *position;
> +               const char *normal;
> +               const char *other;
> +               const char *mvp;
> +               const char *mv_invtrans;
> +
> +               if ((key & 2) != 0) {
> +                       mvp = "state.matrix.mvp";
> +                       position =
> +                               "DP4   p.x, mvp[0], vp;\n"
> +                               "DP4   p.y, mvp[1], vp;\n"
> +                               "DP4   p.z, mvp[2], vp;\n"
> +                               "DP4   p.w, mvp[3], vp;\n"
> +                               ;
> +               } else {
> +                       mvp = "state.matrix.mvp.transpose";
> +                       position =
> +                               "MUL   r0, mvp[0], vp.xxxx;\n"
> +                               "MAD   r0, mvp[1], vp.yyyy, r0;\n"
> +                               "MAD   r0, mvp[2], vp.zzzz, r0;\n"
> +                               "MAD   r0, mvp[3], vp.wwww, r0;\n"
> +                               "MOV   p, r0;\n"
> +                               ;
> +               }
> +
> +               if ((key & 4) != 0) {
> +                       mv_invtrans = "state.matrix.modelview.invtrans";
> +                       normal =
> +                               "DP3   n.x, mv_invtrans[0], vn;\n"
> +                               "DP3   n.y, mv_invtrans[1], vn;\n"
> +                               "DP3   n.z, mv_invtrans[2], vn;\n"
> +                               ;
> +               } else {
> +                       mv_invtrans = "state.matrix.modelview.inverse";
> +                       normal =
> +                               "MUL   r0.xyz, mv_invtrans[0], vn;\n"
> +                               "MAD   r0.xyz, mv_invtrans[1], vn, r0;\n"
> +                               "MAD   r0.xyz, mv_invtrans[2], vn, r0;\n"
> +                               "SWZ   n, r0, x, y, z, 0;\n"
> +                               ;
> +               }
> +
> +               if ((key & 8) != 0) {
> +                       other =
> +                               "# Output the color\n"
> +                               "MOV   t, vertex.color;\n"
> +                               ;
> +               } else {
> +                       other =
> +                               "# Output the texture coordinate\n"
> +                               "MOV   t, vertex.texcoord[0];\n"
> +                               ;
> +               }
> +
> +               asprintf(&source,
> +                        "!!ARBvp1.0\n"
> +                        "# Program key 0x%04x\n"
> +                        "ATTRIB vp = vertex.position;\n"
> +                        "ATTRIB vn = vertex.normal;\n"
> +                        "PARAM mvp[4] = { %s.row[0..3] };\n"
> +                        "PARAM mv_invtrans[3] = { %s.row[0..2] };\n"
> +                        "OUTPUT p = result.position;\n"
> +                        "OUTPUT n = result.texcoord[0];\n"
> +                        "OUTPUT t = result.texcoord[1];\n"
> +                        "TEMP r0;\n"
> +                        "\n"
> +                        "# Transform the vertex to clip coordinates.\n"
> +                        "%s"
> +                        "\n"
> +                        "# Transform the normal to eye coordinates.\n"
> +                        "%s"
> +                        "\n"
> +                        "%s"
> +                        "END",
> +                        key,
> +                        mvp,
> +                        mv_invtrans,
> +                        position,
> +                        normal,
> +                        other);
> +       } else {
> +               printf("Unknown program target %s (0x%04x) in %s.\n",
> +                      piglit_get_gl_enum_name(target), target,
> +                      __func__);
> +               piglit_report_result(PIGLIT_FAIL);
> +       }
> +
> +       return source;
> +}
> +
> +/**
> + * Selects a program target based on the key and the supported extensions.
> + */
> +static GLenum
> +select_program_target(unsigned key)
> +{
> +       GLenum target = 0;
> +
> +       (void) key;
> +
> +       if (piglit_is_extension_supported("GL_ARB_vertex_program")) {
> +               target = GL_VERTEX_PROGRAM_ARB;
> +       }
> +
> +       return target;
> +}
> +
> +static bool
> +create_program(unsigned name, bool silent_skip)
> +{
> +       char *source;
> +       const GLenum target = select_program_target(name);
> +
> +       if (target == 0) {
> +               if (silent_skip)
> +                       return true;
> +
> +               printf("%s requires GL_ARB_vertex_program.\n", __func__);
> +               piglit_report_result(PIGLIT_SKIP);
> +       }
> +
> +       if (glIsProgramARB(name)) {
> +               printf("\t%s,%d: %u is already a program\n",
> +                      __func__, __LINE__, name);
> +               return false;
> +       }
> +
> +       glBindProgramARB(target, name);
> +
> +       source = generate_program_source(target, name);
> +       glProgramStringARB(target, GL_PROGRAM_FORMAT_ASCII_ARB,
> +                          strlen(source), source);
> +
> +       free(source);
> +
> +       glBindProgramARB(target, 0);
> +
> +       return piglit_check_gl_error(GL_NO_ERROR);
> +}
> +
> +static bool
> +validate_program(unsigned name)
> +{
> +       bool pass = true;
> +       const GLenum target = select_program_target(name);
> +       char *expected = generate_program_source(target, name);
> +       const int expected_length = strlen(expected);
> +       char *got;
> +       GLint length;
> +
> +       if (!glIsProgramARB(name)) {
> +               printf("\t%s,%d: %u is not a program\n",
> +                      __func__, __LINE__, name);
> +               return false;
> +       }
> +
> +       glBindProgramARB(target, name);
> +
> +       /* The GL_ARB_vertex_program spec does not say whether or not length
> +        * includes a terminating NUL.  It says:
> +        *
> +        *     "If <pname> is PROGRAM_LENGTH_ARB ... GetProgramivARB returns
> +        *     one integer holding the program string length (in bytes)
> +        *     ... for the program object currently bound to <target>."
> +        *
> +        * and, with respect to glGetProgramStringARB it says:
> +        *
> +        *     "<n> ubytes are returned into the array program where <n> is
> +        *     the length of the program in ubytes, as returned by
> +        *     GetProgramivARB when <pname> is PROGRAM_LENGTH_ARB."
> +        */
> +       glGetProgramivARB(target,
> +                         GL_PROGRAM_LENGTH_ARB,
> +                         &length);
> +       if (length != expected_length && length != (expected_length + 1)) {
> +               printf("\t%s,%d: Program %u length invalid: got %d, expected "
> +                      "%d or %d.\n",
> +                      __func__, __LINE__,
> +                      name,
> +                      length, expected_length, expected_length + 1);
> +               pass = false;
> +       }
> +
> +       got = calloc(length, sizeof(char));
> +       glGetProgramStringARB(target,
> +                             GL_PROGRAM_STRING_ARB,
> +                             got);
> +
> +       if (memcmp(expected, got, expected_length) != 0) {
> +               printf("\t%s,%d: %u source mismatch\n",
> +                      __func__, __LINE__,
> +                      name);
> +               pass = false;
> +       }
> +
> +       free(got);
> +       free(expected);
> +
> +       glBindProgramARB(target, 0);
> +
> +       return piglit_check_gl_error(GL_NO_ERROR) && pass;
> +}
> +/*@}*/
> +
>  /** \name Methods for operating on renderbuffer objects */
>  /*@{*/
>  static bool
> @@ -1049,6 +1261,7 @@ static const struct {
>  } object_types[] = {
>         { "buffer", create_buffer, validate_buffer },
>         { "framebuffer", create_framebuffer, validate_framebuffer },
> +       { "program", create_program, validate_program },
>         { "renderbuffer", create_renderbuffer, validate_renderbuffer },
>         { "texture", create_texture, validate_texture },
>  };
> --
> 2.5.0
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list