Module: Mesa Branch: main Commit: c50bbf1f2891099c2cec7329b5c5c0334a9536d8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c50bbf1f2891099c2cec7329b5c5c0334a9536d8
Author: Jesse Natalie <[email protected]> Date: Mon Apr 19 07:10:59 2021 -0700 microsoft/clc: Support passing specialization consts to spirv_to_nir Acked-by: Lionel Landwerlin <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10322> --- src/microsoft/clc/clc_compiler.c | 4 +++- src/microsoft/clc/clc_compiler.h | 25 +++++++++++++++++++++++++ src/microsoft/clc/compute_test.cpp | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/microsoft/clc/clc_compiler.c b/src/microsoft/clc/clc_compiler.c index 3aa16304909..6bf4e7a5785 100644 --- a/src/microsoft/clc/clc_compiler.c +++ b/src/microsoft/clc/clc_compiler.c @@ -1040,6 +1040,7 @@ clc_spirv_to_dxil(struct clc_libclc *lib, const struct clc_parsed_spirv *parsed_data, const char *entrypoint, const struct clc_runtime_kernel_conf *conf, + const struct clc_spirv_specialization_consts *consts, const struct clc_logger *logger, struct clc_dxil_object *out_dxil) { @@ -1093,7 +1094,8 @@ clc_spirv_to_dxil(struct clc_libclc *lib, glsl_type_singleton_init_or_ref(); nir = spirv_to_nir(linked_spirv->data, linked_spirv->size / 4, - NULL, 0, + consts ? (struct nir_spirv_specialization *)consts->specializations : NULL, + consts ? consts->num_specializations : 0, MESA_SHADER_KERNEL, entrypoint, &spirv_options, &nir_options); diff --git a/src/microsoft/clc/clc_compiler.h b/src/microsoft/clc/clc_compiler.h index cc957d0df83..301a0166983 100644 --- a/src/microsoft/clc/clc_compiler.h +++ b/src/microsoft/clc/clc_compiler.h @@ -278,12 +278,37 @@ struct clc_runtime_kernel_conf { unsigned support_workgroup_id_offsets; }; +typedef union { + bool b; + float f32; + double f64; + int8_t i8; + uint8_t u8; + int16_t i16; + uint16_t u16; + int32_t i32; + uint32_t u32; + int64_t i64; + uint64_t u64; +} clc_spirv_const_value; + +struct clc_spirv_specialization { + uint32_t id; + clc_spirv_const_value value; + bool defined_on_module; +}; + +struct clc_spirv_specialization_consts { + const struct clc_spirv_specialization *specializations; + unsigned num_specializations; +}; bool clc_spirv_to_dxil(struct clc_libclc *lib, const struct clc_binary *linked_spirv, const struct clc_parsed_spirv *parsed_data, const char *entrypoint, const struct clc_runtime_kernel_conf *conf, + const struct clc_spirv_specialization_consts *consts, const struct clc_logger *logger, struct clc_dxil_object *out_dxil); diff --git a/src/microsoft/clc/compute_test.cpp b/src/microsoft/clc/compute_test.cpp index 34482e3ea49..dc7d8507198 100644 --- a/src/microsoft/clc/compute_test.cpp +++ b/src/microsoft/clc/compute_test.cpp @@ -869,7 +869,7 @@ ComputeTest::configure(Shader &shader, clc_free_dxil_object(dxil); delete dxil; }); - if (!clc_spirv_to_dxil(compiler_ctx, shader.obj.get(), shader.metadata.get(), "main_test", conf, &logger, shader.dxil.get())) + if (!clc_spirv_to_dxil(compiler_ctx, shader.obj.get(), shader.metadata.get(), "main_test", conf, nullptr, &logger, shader.dxil.get())) throw runtime_error("failed to compile kernel!"); }
