[Mesa-dev] [PATCH 1/6] anv: hook internal validate layer only for debug builds

Jason Ekstrand jason at jlekstrand.net
Wed Jul 27 16:48:59 UTC 2016


I looked at the one validate function we still have and I don't think it
validates anything that won't trigger asserts elsewhere.  Let's just kill
it all.

On Jul 27, 2016 8:37 AM, "Emil Velikov" <emil.l.velikov at gmail.com> wrote:

> On 27 July 2016 at 16:17, Jason Ekstrand <jason at jlekstrand.net> wrote:
> > On Jul 27, 2016 6:03 AM, "Emil Velikov" <emil.l.velikov at gmail.com>
> wrote:
> >>
> >> From: Emil Velikov <emil.velikov at collabora.com>
> >>
> >> Presently the layer has only a single entry point, which uses asserts
> >> solely.
> >> Thus even on release builds the function (and thus the whole layer) will
> >> do
> >> nothing but adding runtime and binary(size) overhead.
> >>
> >> Cc: "12.0" <mesa-stable at lists.freedesktop.org>
> >> Cc: Jason Ekstrand <jason at jlekstrand.net>
> >> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> >> ---
> >> We can use a ANV_USE_VALIDATE macro which atm will default to == DEBUG.
> >> ---
> >>  src/intel/vulkan/anv_entrypoints_gen.py | 36
> >> +++++++++++++++++++++++----------
> >>  src/intel/vulkan/anv_image.c            |  2 ++
> >>  2 files changed, 27 insertions(+), 11 deletions(-)
> >>
> >> diff --git a/src/intel/vulkan/anv_entrypoints_gen.py
> >> b/src/intel/vulkan/anv_entrypoints_gen.py
> >> index 2896174..a4922c2 100644
> >> --- a/src/intel/vulkan/anv_entrypoints_gen.py
> >> +++ b/src/intel/vulkan/anv_entrypoints_gen.py
> >> @@ -134,7 +134,9 @@ if opt_header:
> >>          print "%s gen75_%s%s;" % (type, name, args)
> >>          print "%s gen8_%s%s;" % (type, name, args)
> >>          print "%s gen9_%s%s;" % (type, name, args)
> >> +        print "#ifdef DEBUG"
> >>          print "%s anv_validate_%s%s;" % (type, name, args)
> >> +        print "#endif // DEBUG"
>
> >>          print_guard_end(name)
> >>      exit()
> >>
> >> @@ -185,14 +187,7 @@ for type, name, args, num, h in entrypoints:
> >>      print "   \"vk%s\\0\"" % name
> >>      offsets.append(i)
> >>      i += 2 + len(name) + 1
> >> -print """   ;
> >> -
> >> -/* Weak aliases for all potential validate functions. These will
> resolve
> >> to
> >> - * NULL if they're not defined, which lets the resolve_entrypoint()
> >> function
> >> - * either pick a validate wrapper if available or just plug in the
> actual
> >> - * entry point.
> >> - */
> >> -"""
> >> +print "   ;"
> >>
> >>  # Now generate the table of all entry points and their validation
> >> functions
> >>
> >> @@ -201,7 +196,18 @@ for type, name, args, num, h in entrypoints:
> >>      print "   { %5d, 0x%08x }," % (offsets[num], h)
> >>  print "};\n"
> >>
> >> +print """
> >> +
> >> +/* Weak aliases for all potential validate functions. These will
> resolve
> >> to
> >> + * NULL if they're not defined, which lets the resolve_entrypoint()
> >> function
> >> + * either pick a validate wrapper if available or just plug in the
> actual
> >> + * entry point.
> >> + */
> >> +"""
> >> +
> >>  for layer in [ "anv", "validate", "gen7", "gen75", "gen8", "gen9" ]:
> >> +    if "validate" in layer:
> >> +        print "#ifdef DEBUG"
> >>      for type, name, args, num, h in entrypoints:
> >>          print_guard_start(name)
> >>          print "%s %s_%s%s __attribute__ ((weak));" % (type, layer,
> name,
> >> args)
> >> @@ -211,13 +217,13 @@ for layer in [ "anv", "validate", "gen7", "gen75",
> >> "gen8", "gen9" ]:
> >>          print_guard_start(name)
> >>          print "   .%s = %s_%s," % (name, layer, name)
> >>          print_guard_end(name)
> >> +    if "validate" in layer:
> >> +        print "#endif // DEBUG"
> >>      print "};\n"
> >>
> >>  print """
> >>  #ifdef DEBUG
> >>  static bool enable_validate = true;
> >> -#else
> >> -static bool enable_validate = false;
> >>  #endif
> >>
> >>  /* We can't use symbols that need resolving (like, oh, getenv) in the
> >> resolve
> >> @@ -231,8 +237,14 @@ determine_validate(void)
> >>  {
> >>     const char *s = getenv("ANV_VALIDATE");
> >>
> >> -   if (s)
> >> +   if (s) {
> >> +#ifdef DEBUG
> >>        enable_validate = atoi(s);
> >> +#else
> >> +      fprintf(stderr, "libvulkand-intel was built without VALIDATE
> >> support.\\n");
> >> +      abort();
> >> +#endif
> >> +   }
> >>  }
> >>
> >>  static const struct brw_device_info *dispatch_devinfo;
> >> @@ -246,8 +258,10 @@ anv_set_dispatch_devinfo(const struct
> brw_device_info
> >> *devinfo)
> >>  void * __attribute__ ((noinline))
> >>  anv_resolve_entrypoint(uint32_t index)
> >>  {
> >> +#ifdef DEBUG
> >>     if (enable_validate && validate_layer.entrypoints[index])
> >>        return validate_layer.entrypoints[index];
> >> +#endif
> >>
> >>     if (dispatch_devinfo == NULL) {
> >>        return anv_layer.entrypoints[index];
> >> diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
> >> index dff51bc..43d19f5 100644
> >> --- a/src/intel/vulkan/anv_image.c
> >> +++ b/src/intel/vulkan/anv_image.c
> >> @@ -332,6 +332,7 @@ void anv_GetImageSubresourceLayout(
> >>     }
> >>  }
> >>
> >> +#ifdef DEBUG
> >>  VkResult
> >>  anv_validate_CreateImageView(VkDevice _device,
> >
> > As long as anv_entrypoints contains a declaration of this function, we
> don't
> > need to #ifdef around it.  Hopefully, the linker is smart enough to
> detect
> > that it's not used and delete the code.
> >
> So your suggestion is to drop the idef DEBUG hunk around the function
> declaration(s) and this one ? Sure that will work.
>
> The linker will only discard this if using the garbage collector
> (already in place with $(GC_SECTIONS)) and/or LTO.
>
> > Otherwise, this patch seems perfectly reasonable for now.  At one point
> we
> > had the idea that we could use the validate endpoints to do some extra
> > validation that would be shipped in release mode but disabled by default
> at
> > zero cost.  However, we're not really taking advantage of that now and
> do we
> > might as well drop it.
> >
> Or if you want we can drop the validate code all together.
>
> Up-to you really.
> Emil
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160727/4038534c/attachment-0001.html>


More information about the mesa-dev mailing list