[Mesa-dev] [PATCH 12/24] spirv_extensions: define spirv_extensions_supported

Ian Romanick idr at freedesktop.org
Mon Nov 27 21:25:21 UTC 2017


On 11/15/2017 05:22 AM, Eduardo Lima Mitev wrote:
> From: Alejandro PiƱeiro <apinheiro at igalia.com>
> 
> Add a struct to maintain which SPIR-V extensions are supported, and an
> utility method to initialize it based on
> nir_spirv_supported_capabilities.
> ---
>  src/compiler/spirv/spirv_extensions.c | 29 +++++++++++++++++++++++++++++
>  src/compiler/spirv/spirv_extensions.h | 12 ++++++++++++
>  2 files changed, 41 insertions(+)
> 
> diff --git a/src/compiler/spirv/spirv_extensions.c b/src/compiler/spirv/spirv_extensions.c
> index 64d61c49d31..8263b693abd 100644
> --- a/src/compiler/spirv/spirv_extensions.c
> +++ b/src/compiler/spirv/spirv_extensions.c
> @@ -59,3 +59,32 @@ spirv_extensions_to_string(SpvExtension ext)
>  
>     return "unknown";
>  }
> +
> +/**
> + * Sets the supported flags for known SPIR-V extensions based on the
> + * capabilites supported (spirv capabilities based on the spirv to nir
> + * support).
> + *
> + * One could argue that makes more sense in the other way around, as from the
> + * spec pov capabilities are enable for a given extension. But from our pov,
> + * we support or not (depending on the driver) some given capability, and
> + * spirv_to_nir check for capabilities not extensions. Also we usually fill
> + * first the supported capabilities, that are not always related to an
> + * extension.
> + */
> +void
> +fill_supported_spirv_extensions(struct spirv_supported_extensions *ext,
> +                                const struct nir_spirv_supported_capabilities *cap)

Since this is exposed outside this file, this function should have some
sort of a namespace prefix.  I'm not sure what it should be, though.

> +{
> +   for (unsigned i = 0; i < SPV_EXTENSIONS_COUNT; i++)
> +      ext->supported[i] = false;
> +
> +   ext->count = 0;
> +
> +   ext->supported[SPV_KHR_shader_draw_parameters] = cap->draw_parameters;
> +   ext->supported[SPV_KHR_multiview] = cap->multiview;
> +   ext->supported[SPV_KHR_variable_pointers] = cap->variable_pointers;
> +
> +   for (unsigned i = 0; i < SPV_EXTENSIONS_COUNT; i++)
> +      if (ext->supported[i]) ext->count++;

   for (unsigned i = 0; i < SPV_EXTENSIONS_COUNT; i++) {
      if (ext->supported[i])
         ext->count++;
   }

> +}
> diff --git a/src/compiler/spirv/spirv_extensions.h b/src/compiler/spirv/spirv_extensions.h
> index 54bc7f2dbe0..22238b727d7 100644
> --- a/src/compiler/spirv/spirv_extensions.h
> +++ b/src/compiler/spirv/spirv_extensions.h
> @@ -25,6 +25,7 @@
>  #define _SPIRV_EXTENSIONS_H_
>  
>  #include "compiler/nir/nir.h"
> +#include "nir_spirv.h"
>  
>  #ifdef __cplusplus
>  extern "C" {
> @@ -60,8 +61,19 @@ typedef enum SpvExtension_ {
>     SPV_EXTENSIONS_COUNT
>  } SpvExtension;
>  
> +struct spirv_supported_extensions {
> +   /** Flags the supported extensions. Array to make it easier to iterate. */
> +   bool supported[SPV_EXTENSIONS_COUNT];
> +
> +   /** Number of supported extensions */
> +   unsigned int count;

I see this is used by _mesa_get_spirv_extension_count, but I don't see
where that is used.  Did I miss it?

> +};
> +
>  const char *spirv_extensions_to_string(SpvExtension ext);
>  
> +void fill_supported_spirv_extensions(struct spirv_supported_extensions *ext,
> +                                     const struct nir_spirv_supported_capabilities *cap);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> 



More information about the mesa-dev mailing list