[Mesa-dev] [PATCH 1/6] anv: hook internal validate layer only for debug builds
Emil Velikov
emil.l.velikov at gmail.com
Wed Jul 27 15:37:36 UTC 2016
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
More information about the mesa-dev
mailing list