[Mesa-dev] [PATCH v2 8/14] anv: generate anv_entrypoints.{h, c} in one command

Eric Engestrom eric.engestrom at imgtec.com
Fri Feb 24 11:10:04 UTC 2017


On Thursday, 2017-02-23 10:46:21 -0800, Dylan Baker wrote:
> This changes the python generator to write the files itself, rather than
> piping them out. This has a couple of advantages: first, it encapsulates
> the encoding. Second, it ensures that the header file and code file are
> generated at the same time with the same data.
> 
> v2: - Update Android.mk
> 
> Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
> ---
>  src/intel/vulkan/Android.mk             |  7 +-----
>  src/intel/vulkan/Makefile.am            |  8 ++----
>  src/intel/vulkan/anv_entrypoints_gen.py | 33 +++++++++++++-------------
>  3 files changed, 22 insertions(+), 26 deletions(-)
> 
> diff --git a/src/intel/vulkan/Android.mk b/src/intel/vulkan/Android.mk
> index 9dabf1c..df10141 100644
> --- a/src/intel/vulkan/Android.mk
> +++ b/src/intel/vulkan/Android.mk
> @@ -60,8 +60,8 @@ $(intermediates)/dummy.c:
>  	@echo "Gen Dummy: $(PRIVATE_MODULE) <= $(notdir $(@))"
>  	$(hide) touch $@
>  
> -$(intermediates)/anv_entrypoints.h:
> -	$(VK_ENTRYPOINTS_SCRIPT) header --xml $(MESA_TOP)/src/vulkan/registry/vk.xml > $@
> +$(intermediates)/anv_entrypoints.h $(intermediates)/anv_entrypoints.c:
> +	$(VK_ENTRYPOINTS_SCRIPT) --xml $(MESA_TOP)/src/vulkan/registry/vk.xml

You forgot to add the new argument here.

>  
>  LOCAL_EXPORT_C_INCLUDE_DIRS := \
>          $(intermediates)
> @@ -176,9 +176,6 @@ LOCAL_WHOLE_STATIC_LIBRARIES := libmesa_anv_entrypoints libmesa_genxml
>  
>  LOCAL_GENERATED_SOURCES += $(intermediates)/anv_entrypoints.c
>  
> -$(intermediates)/anv_entrypoints.c:
> -	$(VK_ENTRYPOINTS_SCRIPT) code --xml $(MESA_TOP)/src/vulkan/registry/vk.xml > $@
> -
>  LOCAL_SHARED_LIBRARIES := libdrm_intel
>  
>  include $(MESA_COMMON_MK)
> diff --git a/src/intel/vulkan/Makefile.am b/src/intel/vulkan/Makefile.am
> index 565559c..38a50c9 100644
> --- a/src/intel/vulkan/Makefile.am
> +++ b/src/intel/vulkan/Makefile.am
> @@ -145,11 +145,9 @@ libvulkan_intel_la_SOURCES = $(VULKAN_GEM_FILES)
>  
>  vulkan_api_xml = $(top_srcdir)/src/vulkan/registry/vk.xml
>  
> -anv_entrypoints.h : anv_entrypoints_gen.py $(vulkan_api_xml)
> -	$(AM_V_GEN)$(PYTHON2) $(srcdir)/anv_entrypoints_gen.py header --xml $(vulkan_api_xml) > $@
> -
> -anv_entrypoints.c : anv_entrypoints_gen.py $(vulkan_api_xml)
> -	$(AM_V_GEN)$(PYTHON2) $(srcdir)/anv_entrypoints_gen.py code --xml $(vulkan_api_xml) > $@
> +anv_entrypoints.h anv_entrypoints.c: anv_entrypoints_gen.py $(vulkan_api_xml)

This will run the script twice, once for anv_entrypoints.h and once for
anv_entrypoints.c, but the script will write both, both times.
This also introduces a race condition when using `make -j N`, as it will
have two threads writing to both files, potentially at the same time.

You're also hardcoding the filename in the script, which will introduce
bugs if/when files get renamed.

> +	$(AM_V_GEN)$(PYTHON2) $(srcdir)/anv_entrypoints_gen.py \
> +		--xml $(vulkan_api_xml) --outdir $(builddir)

I think passing `--out $@` in the makefile and checking the filename to
decide which file to write (and only write that one) is a better option.
See below for what that code would look like.

>  
>  BUILT_SOURCES = $(VULKAN_GENERATED_FILES)
>  CLEANFILES = $(BUILT_SOURCES) dev_icd.json intel_icd. at host_cpu@.json
> diff --git a/src/intel/vulkan/anv_entrypoints_gen.py b/src/intel/vulkan/anv_entrypoints_gen.py
> index 45a463c..5066195 100644
> --- a/src/intel/vulkan/anv_entrypoints_gen.py
> +++ b/src/intel/vulkan/anv_entrypoints_gen.py
[snip]
> @@ -370,10 +371,10 @@ def main():
>  
>      # For outputting entrypoints.h we generate a anv_EntryPoint() prototype
>      # per entry point.
> -    if args.target == 'header':
> -        print TEMPLATE_H.render(entrypoints=entrypoints)
> -    else:
> -        gen_code(entrypoints)
> +    with open(os.path.join(args.outdir, 'anv_entrypoints.h'), 'wb') as f:
> +        f.write(TEMPLATE_H.render(entrypoints=entrypoints))
> +    with open(os.path.join(args.outdir, 'anv_entrypoints.c'), 'wb') as f:
> +        f.write(gen_code(entrypoints))

This would become:
    with open(args.out, 'wb') as f:
        if args.out.endswith('.h'):
            f.write(TEMPLATE_H.render(entrypoints=entrypoints))
        else:
            f.write(gen_code(entrypoints))

>  
>  
>  if __name__ == '__main__':
> -- 
> git-series 0.9.0


More information about the mesa-dev mailing list