[Mesa-dev] [PATCH 1/2] spirv: add interface for drivers to define support extensions.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Wed Dec 28 08:14:59 UTC 2016


Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

On Wed, Dec 28, 2016 at 12:30 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> I expect over time the struct contents will change as all
> drivers support stuff etc, but for now this should be a good
> starting point.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/compiler/spirv/nir_spirv.h    |  6 ++++++
>  src/compiler/spirv/spirv2nir.c    |  2 +-
>  src/compiler/spirv/spirv_to_nir.c | 17 +++++++++++++++--
>  src/compiler/spirv/vtn_private.h  |  1 +
>  src/intel/vulkan/anv_pipeline.c   |  2 +-
>  5 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h
> index 500f2cb..d959f3f 100644
> --- a/src/compiler/spirv/nir_spirv.h
> +++ b/src/compiler/spirv/nir_spirv.h
> @@ -41,10 +41,16 @@ struct nir_spirv_specialization {
>     uint32_t data;
>  };
>
> +struct nir_spirv_supported_extensions {
> +   bool storage_image_extended_formats;
> +   bool image_ms_array;
> +};
> +
>  nir_function *spirv_to_nir(const uint32_t *words, size_t word_count,
>                             struct nir_spirv_specialization *specializations,
>                             unsigned num_specializations,
>                             gl_shader_stage stage, const char *entry_point_name,
> +                           const struct nir_spirv_supported_extensions *ext,
>                             const nir_shader_compiler_options *options);
>
>  #ifdef __cplusplus
> diff --git a/src/compiler/spirv/spirv2nir.c b/src/compiler/spirv/spirv2nir.c
> index 3dc0735..0ae14fb 100644
> --- a/src/compiler/spirv/spirv2nir.c
> +++ b/src/compiler/spirv/spirv2nir.c
> @@ -73,7 +73,7 @@ int main(int argc, char **argv)
>     }
>
>     nir_function *func = spirv_to_nir(map, word_count, NULL, 0,
> -                                     MESA_SHADER_FRAGMENT, "main", NULL);
> +                                     MESA_SHADER_FRAGMENT, "main", NULL, NULL);
>     nir_print_shader(func->shader, stderr);
>
>     return 0;
> diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
> index 57d0886..b8acc1e 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -2461,6 +2461,12 @@ stage_for_execution_model(SpvExecutionModel model)
>     }
>  }
>
> +#define spv_check_supported(name, cap) do {            \
> +      if (!(b->ext && b->ext->name))                   \
> +         vtn_warn("Unsupported SPIR-V capability: %s",  \
> +                  spirv_capability_to_string(cap));     \
> +   } while(0)
> +
>  static bool
>  vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
>                                  const uint32_t *w, unsigned count)
> @@ -2519,8 +2525,6 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
>        case SpvCapabilityInt8:
>        case SpvCapabilitySparseResidency:
>        case SpvCapabilityMinLod:
> -      case SpvCapabilityImageMSArray:
> -      case SpvCapabilityStorageImageExtendedFormats:
>        case SpvCapabilityTransformFeedback:
>        case SpvCapabilityStorageImageReadWithoutFormat:
>        case SpvCapabilityStorageImageWriteWithoutFormat:
> @@ -2541,6 +2545,13 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
>           vtn_warn("Unsupported OpenCL-style SPIR-V capability: %s",
>                    spirv_capability_to_string(cap));
>           break;
> +
> +      case SpvCapabilityStorageImageExtendedFormats:
> +         spv_check_supported(storage_image_extended_formats, cap);
> +         break;
> +      case SpvCapabilityImageMSArray:
> +         spv_check_supported(image_ms_array, cap);
> +         break;
>        }
>        break;
>     }
> @@ -3015,6 +3026,7 @@ nir_function *
>  spirv_to_nir(const uint32_t *words, size_t word_count,
>               struct nir_spirv_specialization *spec, unsigned num_spec,
>               gl_shader_stage stage, const char *entry_point_name,
> +             const struct nir_spirv_supported_extensions *ext,
>               const nir_shader_compiler_options *options)
>  {
>     const uint32_t *word_end = words + word_count;
> @@ -3037,6 +3049,7 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
>     exec_list_make_empty(&b->functions);
>     b->entry_point_stage = stage;
>     b->entry_point_name = entry_point_name;
> +   b->ext = ext;
>
>     /* Handle all the preamble instructions */
>     words = vtn_foreach_instruction(b, words, word_end,
> diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h
> index 47579fe..9302611 100644
> --- a/src/compiler/spirv/vtn_private.h
> +++ b/src/compiler/spirv/vtn_private.h
> @@ -347,6 +347,7 @@ struct vtn_builder {
>
>     nir_shader *shader;
>     nir_function_impl *impl;
> +   const struct nir_spirv_supported_extensions *ext;
>     struct vtn_block *block;
>
>     /* Current file, line, and column.  Useful for debugging.  Set
> diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
> index e2fbcab..db35d70 100644
> --- a/src/intel/vulkan/anv_pipeline.c
> +++ b/src/intel/vulkan/anv_pipeline.c
> @@ -124,7 +124,7 @@ anv_shader_compile_to_nir(struct anv_device *device,
>     nir_function *entry_point =
>        spirv_to_nir(spirv, module->size / 4,
>                     spec_entries, num_spec_entries,
> -                   stage, entrypoint_name, nir_options);
> +                   stage, entrypoint_name, NULL, nir_options);
>     nir_shader *nir = entry_point->shader;
>     assert(nir->stage == stage);
>     nir_validate_shader(nir);
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list