[virglrenderer-devel] [RFC PATCH] vrend and build: Obtain version information and add it to the caps v2

Gurchetan Singh gurchetansingh at chromium.org
Mon Jun 4 17:57:31 UTC 2018


The caps structure is supposed to all 32-bit integers, otherwise we
might run into compiler padding/alignment issues (specifically, with
"char host_virglrenderer_version[30]").  IMO this is not necessary.
Most virglrenderer users know (or should know) how to get information
about the host environment.
On Mon, Jun 4, 2018 at 6:44 AM Gert Wollny <gert.wollny at collabora.com> wrote:
>
> In order to make it easier to reproduce and analyse failures in the guest
> system add information about the host system to the caps v2 info.
> Specifically, add the host OpenGL Version string and a version string of
> virglrenderer to the caps that can then be read by the guest.
>
> This patch requires another patch against mesa/virgl to actually read this
> information. Then the information ahout the host system will be presented as
> part of the renderer string, e.g.
>
>   "OpenGL renderer string: virgl (Host: 3.3 (Core Profile) \
>          Mesa 18.2.0-devel (git-bccce60b8a), vrend: 0.6.0 (git-8a78fc59))"
>
> The python script git_sha1_gen.py has been adapted from Mesa. I send this as RFC
> because I'm not sure whether the caps is really the right place to add this
> information or whether it would be better to add another command that would be
> used to pass this information (and possible other things) around. I also didn't
> send the mesa/virgl patch yet, because there the caps.v2 structure is currently
> out of sync with virglrenderer (missing tgsi_invariant and
> shader_buffer_offset_alignment.
>
> Thanks for any comments,
> Gert
>
> ---
>  Makefile.am          |  2 +-
>  bin/git_sha1_gen.py  | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  src/Makefile.am      | 16 +++++++++++++++-
>  src/git_sha1.c.in    |  8 ++++++++
>  src/git_sha1.h       |  1 +
>  src/virgl_hw.h       |  2 ++
>  src/vrend_renderer.c |  8 ++++++++
>  7 files changed, 81 insertions(+), 2 deletions(-)
>  create mode 100644 bin/git_sha1_gen.py
>  create mode 100644 src/git_sha1.c.in
>  create mode 100644 src/git_sha1.h
>
> diff --git a/Makefile.am b/Makefile.am
> index b0121f2..7c4d999 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -29,7 +29,7 @@ pkgconfigdir = $(libdir)/pkgconfig
>  pkgconfig_DATA = virglrenderer.pc
>
>  EXTRA_DIST = \
> -       virglrenderer.pc.in
> +       virglrenderer.pc.in bin
>
>  @CODE_COVERAGE_RULES@
>
> diff --git a/bin/git_sha1_gen.py b/bin/git_sha1_gen.py
> new file mode 100644
> index 0000000..0c87be5
> --- /dev/null
> +++ b/bin/git_sha1_gen.py
> @@ -0,0 +1,46 @@
> +#!/usr/bin/env python
> +
> +"""
> +Generate the contents of the git_sha1.h file.
> +The output of this script goes to stdout.
> +"""
> +
> +
> +import argparse
> +import os
> +import os.path
> +import subprocess
> +import sys
> +
> +
> +def get_git_sha1():
> +    """Try to get the git SHA1 with git rev-parse."""
> +    git_dir = os.path.join(os.path.dirname(sys.argv[0]), '..', '.git')
> +    try:
> +        git_sha1 = "(git-"+ subprocess.check_output([
> +            'git',
> +            '--git-dir=' + git_dir,
> +            'rev-parse',
> +            'HEAD',
> +        ], stderr=open(os.devnull, 'w')).decode("ascii")[:8] + ")"
> +    except:
> +        # don't print anything if it fails
> +        git_sha1 = ''
> +    return git_sha1
> +
> +parser = argparse.ArgumentParser()
> +parser.add_argument('--output', help='File to write the #define in',
> +        required=True)
> +args = parser.parse_args()
> +
> +git_sha1 = os.environ.get('VIRGL_GIT_SHA1_OVERRIDE', get_git_sha1())
> +git_sha1_c_in_path = os.path.join(os.path.dirname(sys.argv[0]),
> +                                  '..', 'src', 'git_sha1.c.in')
> +with open(git_sha1_c_in_path , 'r') as git_sha1_c_in:
> +    new_sha1 = git_sha1_c_in.read().replace('@VCS_TAG@', git_sha1)
> +    if os.path.isfile(args.output):
> +        with open(args.output, 'r') as git_sha1_c:
> +            if git_sha1_c.read() == new_sha1:
> +                quit()
> +            with open(args.output, 'w') as git_sha1_c:
> +                git_sha1_c.write(new_sha1)
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 76f4162..f120fe8 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -1,4 +1,8 @@
>  SUBDIRS := gallium/auxiliary
> +
> +BUILT_SOURCES = git_sha1.c
> +CLEANFILES = $(BUILT_SOURCES)
> +
>  AM_LDFLAGS = -lm \
>         $(GBM_LIBS) \
>         $(EPOXY_LIBS) \
> @@ -21,6 +25,7 @@ libvrend_la_SOURCES = \
>          virgl_hw.h \
>          virgl_protocol.h \
>          vrend_iov.h \
> +        git_sha1.c \
>          vrend_renderer.c \
>          vrend_renderer.h \
>          vrend_shader.c \
> @@ -45,6 +50,7 @@ libvrend_la_SOURCES += \
>         virgl_glx_context.c
>  endif
>
> +
>  lib_LTLIBRARIES = libvirglrenderer.la
>  noinst_LTLIBRARIES = libvrend.la
>
> @@ -58,6 +64,14 @@ libvirglrenderer_la_LDFLAGS = $(GM_LDFLAGS) $(EPOXY_LDFLAGS) $(X11_LDFLAGS)
>  libvirglrendererincludedir = ${includedir}/virgl
>  libvirglrendererinclude_HEADERS = virglrenderer.h
>
> -EXTRA_DIST = gallium/include
> +.PHONY: git_version
> +
> +git_sha1.c: git_version
> +
> +git_version:
> +       @echo "updating $@"
> +       $(PYTHON) $(top_srcdir)/bin/git_sha1_gen.py --output git_sha1.c
> +
> +EXTRA_DIST = gallium/include git_sha1.c.in git_sha1.h
>
>  -include $(top_srcdir)/git.mk
> diff --git a/src/git_sha1.c.in b/src/git_sha1.c.in
> new file mode 100644
> index 0000000..ebf3a5c
> --- /dev/null
> +++ b/src/git_sha1.c.in
> @@ -0,0 +1,8 @@
> +
> +#include "git_sha1.h"
> +
> +const char *get_git_sha1(void)
> +{
> +   return "@VCS_TAG@";
> +}
> +
> diff --git a/src/git_sha1.h b/src/git_sha1.h
> new file mode 100644
> index 0000000..74ef5c8
> --- /dev/null
> +++ b/src/git_sha1.h
> @@ -0,0 +1 @@
> +extern const char *get_git_sha1(void);
> diff --git a/src/virgl_hw.h b/src/virgl_hw.h
> index a430fae..de0391e 100644
> --- a/src/virgl_hw.h
> +++ b/src/virgl_hw.h
> @@ -298,6 +298,8 @@ struct virgl_caps_v2 {
>          uint32_t uniform_buffer_offset_alignment;
>          uint32_t tgsi_invariant;
>          uint32_t shader_buffer_offset_alignment;
> +        char host_gl_version_string[60]; /* OpenGL (ES) profile version string */
> +        char host_virglrenderer_version[30]; /* our version */
>  };
>
>  union virgl_caps {
> diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
> index 4398830..ac4a088 100644
> --- a/src/vrend_renderer.c
> +++ b/src/vrend_renderer.c
> @@ -49,6 +49,7 @@
>  #include "vrend_shader.h"
>
>  #include "vrend_renderer.h"
> +#include "git_sha1.h"
>
>  #include "virgl_hw.h"
>
> @@ -6683,10 +6684,17 @@ static bool vrend_renderer_fill_caps_common(uint32_t set, uint32_t version,
>     } else if (set == 2) {
>        memset(caps, 0, sizeof(*caps));
>        caps->max_version = 2;
> +
> +      snprintf(caps->v2.host_gl_version_string, 59, "%s", glGetString(GL_VERSION));
> +      snprintf(caps->v2.host_virglrenderer_version, 29, "%s %s",
> +               PACKAGE_VERSION, get_git_sha1());
> +      debug_printf("Host: %s, vrend: %s\n", caps->v2.host_gl_version_string,
> +                   caps->v2.host_virglrenderer_version);
>     }
>
>     gl_ver = epoxy_gl_version();
>
> +
>     /*
>      * We can't fully support this feature on GLES,
>      * but it is needed for OpenGL 2.1 so lie.
> --
> 2.16.4
>
> _______________________________________________
> virglrenderer-devel mailing list
> virglrenderer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/virglrenderer-devel


More information about the virglrenderer-devel mailing list