diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index facd2f6640e..cb4922df9a8 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -154,7 +154,7 @@ compile_nir(struct d3d12_context *ctx, struct d3d12_shader_selector *sel, #endif struct blob tmp; - if (!nir_to_dxil(nir, &opts, &tmp)) { + if (!nir_to_dxil(nir, &opts, NULL, &tmp)) { debug_printf("D3D12: nir_to_dxil failed\n"); return NULL; } diff --git a/src/microsoft/clc/clc_compiler.c b/src/microsoft/clc/clc_compiler.c index ac807e76bed..f363fe207e5 100644 --- a/src/microsoft/clc/clc_compiler.c +++ b/src/microsoft/clc/clc_compiler.c @@ -1143,8 +1143,11 @@ clc_spirv_to_dxil(struct clc_libclc *lib, goto err_free_dxil; } + struct dxil_logger dxil_logger = {.priv = logger->priv, + .log = logger->error}; + struct blob tmp; - if (!nir_to_dxil(nir, &opts, &tmp)) { + if (!nir_to_dxil(nir, &opts, &dxil_logger, &tmp)) { debug_printf("D3D12: nir_to_dxil failed\n"); goto err_free_dxil; } diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index 5561c872709..55e23e206a7 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -63,6 +63,15 @@ DEBUG_GET_ONCE_FLAGS_OPTION(debug_dxil, "DXIL_DEBUG", dxil_debug_options, 0) fprintf(stderr, "\n"); \ } while (0) +static void +default_logger_func(void *priv, const char *msg) +{ + fprintf(stderr, "%s", msg); + unreachable("Unhandled error"); +} + +static const struct dxil_logger default_logger = { .priv = NULL, .log = default_logger_func }; + #define TRACE_CONVERSION(instr) \ if (debug_dxil & DXIL_DEBUG_TRACE) \ do { \ @@ -487,6 +496,8 @@ struct ntd_context { struct dxil_func_def *main_func_def; struct dxil_func_def *tess_ctrl_patch_constant_func_def; unsigned unnamed_ubo_count; + + const struct dxil_logger *logger; }; static const char* @@ -5797,7 +5808,7 @@ static const unsigned dxil_validator_max_capable_version = DXIL_VALIDATOR_1_7; bool nir_to_dxil(struct nir_shader *s, const struct nir_to_dxil_options *opts, - struct blob *blob) + const struct dxil_logger *logger, struct blob *blob) { assert(opts); bool retval = true; @@ -5831,6 +5842,7 @@ nir_to_dxil(struct nir_shader *s, const struct nir_to_dxil_options *opts, ctx->opts = opts; ctx->shader = s; + ctx->logger = logger ? logger : &default_logger; ctx->ralloc_ctx = ralloc_context(NULL); if (!ctx->ralloc_ctx) { diff --git a/src/microsoft/compiler/nir_to_dxil.h b/src/microsoft/compiler/nir_to_dxil.h index cab8c4d18bf..dc8228cbeed 100644 --- a/src/microsoft/compiler/nir_to_dxil.h +++ b/src/microsoft/compiler/nir_to_dxil.h @@ -101,9 +101,16 @@ struct nir_to_dxil_options { uint32_t validator_version_max; }; +typedef void (*dxil_msg_callback)(void *priv, const char *msg); + +struct dxil_logger { + void *priv; + dxil_msg_callback log; +}; + bool nir_to_dxil(struct nir_shader *s, const struct nir_to_dxil_options *opts, - struct blob *blob); + const struct dxil_logger *logger, struct blob *blob); const nir_shader_compiler_options* dxil_get_nir_compiler_options(void); diff --git a/src/microsoft/spirv_to_dxil/spirv2dxil.c b/src/microsoft/spirv_to_dxil/spirv2dxil.c index e590034be95..6c700f89c8a 100644 --- a/src/microsoft/spirv_to_dxil/spirv2dxil.c +++ b/src/microsoft/spirv_to_dxil/spirv2dxil.c @@ -62,6 +62,12 @@ stage_to_enum(char *stage) return MESA_SHADER_NONE; } +static void +log_spirv_to_dxil_error(void *priv, const char *msg) +{ + fprintf(stderr, "spirv_to_dxil error: %s", msg); +} + int main(int argc, char **argv) { @@ -142,12 +148,16 @@ main(int argc, char **argv) struct dxil_spirv_debug_options dbg_opts = { .dump_nir = debug, }; + const struct dxil_spirv_logger logger = { + .priv = NULL, + .log = log_spirv_to_dxil_error + }; struct dxil_spirv_object obj; memset(&obj, 0, sizeof(obj)); if (spirv_to_dxil((uint32_t *)file_contents, word_count, NULL, 0, (dxil_spirv_shader_stage)shader_stage, entry_point, - &dbg_opts, &conf, &obj)) { + &dbg_opts, &conf, &logger, &obj)) { if (validate && !validate_dxil(&obj)) { fprintf(stderr, "Failed to validate DXIL\n"); diff --git a/src/microsoft/spirv_to_dxil/spirv_to_dxil.c b/src/microsoft/spirv_to_dxil/spirv_to_dxil.c index b62fb9832e6..9876c10939e 100644 --- a/src/microsoft/spirv_to_dxil/spirv_to_dxil.c +++ b/src/microsoft/spirv_to_dxil/spirv_to_dxil.c @@ -23,8 +23,8 @@ #include "dxil_spirv_nir.h" #include "spirv_to_dxil.h" -#include "nir_to_dxil.h" #include "dxil_nir.h" +#include "nir_to_dxil.h" #include "shader_enums.h" #include "spirv/nir_spirv.h" #include "util/blob.h" @@ -96,6 +96,7 @@ spirv_to_dxil(const uint32_t *words, size_t word_count, const char *entry_point_name, const struct dxil_spirv_debug_options *dgb_opts, const struct dxil_spirv_runtime_conf *conf, + const struct dxil_spirv_logger *logger, struct dxil_spirv_object *out_dxil) { if (stage == DXIL_SPIRV_SHADER_NONE || stage == DXIL_SPIRV_SHADER_KERNEL) @@ -148,8 +149,12 @@ spirv_to_dxil(const uint32_t *words, size_t word_count, .shader_model_max = SHADER_MODEL_6_2, .validator_version_max = DXIL_VALIDATOR_1_4, }; + + struct dxil_logger logger_inner = {.priv = logger->priv, + .log = logger->log}; + struct blob dxil_blob; - if (!nir_to_dxil(nir, &opts, &dxil_blob)) { + if (!nir_to_dxil(nir, &opts, &logger_inner, &dxil_blob)) { if (dxil_blob.allocated) blob_finish(&dxil_blob); ralloc_free(nir); diff --git a/src/microsoft/spirv_to_dxil/spirv_to_dxil.h b/src/microsoft/spirv_to_dxil/spirv_to_dxil.h index a1ee16e0d68..ee657ebb0eb 100644 --- a/src/microsoft/spirv_to_dxil/spirv_to_dxil.h +++ b/src/microsoft/spirv_to_dxil/spirv_to_dxil.h @@ -163,6 +163,13 @@ struct dxil_spirv_debug_options { bool dump_nir; }; +typedef void (*dxil_spirv_msg_callback)(void *priv, const char *msg); + +struct dxil_spirv_logger { + void *priv; + dxil_spirv_msg_callback log; +}; + /** * Compile a SPIR-V module into DXIL. * \param words SPIR-V module to compile @@ -182,6 +189,7 @@ spirv_to_dxil(const uint32_t *words, size_t word_count, const char *entry_point_name, const struct dxil_spirv_debug_options *debug_options, const struct dxil_spirv_runtime_conf *conf, + const struct dxil_spirv_logger *logger, struct dxil_spirv_object *out_dxil); /** diff --git a/src/microsoft/vulkan/dzn_meta.c b/src/microsoft/vulkan/dzn_meta.c index 0a894eb8681..661fc3d2317 100644 --- a/src/microsoft/vulkan/dzn_meta.c +++ b/src/microsoft/vulkan/dzn_meta.c @@ -51,7 +51,7 @@ dzn_meta_compile_shader(struct dzn_device *device, nir_shader *nir, #endif }; struct blob dxil_blob; - ASSERTED bool ret = nir_to_dxil(nir, &opts, &dxil_blob); + ASSERTED bool ret = nir_to_dxil(nir, &opts, NULL, &dxil_blob); assert(ret); #ifdef _WIN32 diff --git a/src/microsoft/vulkan/dzn_pipeline.c b/src/microsoft/vulkan/dzn_pipeline.c index 447d82a4660..70226eef91e 100644 --- a/src/microsoft/vulkan/dzn_pipeline.c +++ b/src/microsoft/vulkan/dzn_pipeline.c @@ -358,7 +358,7 @@ dzn_pipeline_compile_shader(struct dzn_device *device, if (instance->debug_flags & DZN_DEBUG_NIR) nir_print_shader(nir, stderr); - if (nir_to_dxil(nir, &opts, &dxil_blob)) { + if (nir_to_dxil(nir, &opts, NULL, &dxil_blob)) { blob_finish_get_buffer(&dxil_blob, (void **)&slot->pShaderBytecode, (size_t *)&slot->BytecodeLength); } else {