From 6c0740c1299c86bb4ca3e6fb68d87c1cc5eb04cc Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 9 Feb 2022 15:43:15 -0500 Subject: [PATCH] zink: split off CreateShaderModule into util function Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 43 +++++++++++++++++++------------- src/gallium/drivers/zink/zink_compiler.h | 4 ++- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 8216914..f09625e 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1021,6 +1021,29 @@ zink_shader_dump(void *words, size_t size, const char *file) } VkShaderModule +zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, struct spirv_shader *spirv) +{ + VkShaderModule mod; + VkShaderModuleCreateInfo smci = {0}; + + if (zink_debug & ZINK_DEBUG_SPIRV) { + char buf[256]; + static int i; + snprintf(buf, sizeof(buf), "dump%02d.spv", i++); + zink_shader_dump(spirv->words, spirv->num_words * sizeof(uint32_t), buf); + } + + smci.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + smci.codeSize = spirv->num_words * sizeof(uint32_t); + smci.pCode = spirv->words; + + VkResult ret = VKSCR(CreateShaderModule)(screen->dev, &smci, NULL, &mod); + bool success = zink_screen_handle_vkresult(screen, ret); + assert(success); + return success ? mod : VK_NULL_HANDLE; +} + +VkShaderModule zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shader *base_nir, const struct zink_shader_key *key) { VkShaderModule mod = VK_NULL_HANDLE; @@ -1133,25 +1156,9 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad NIR_PASS_V(nir, nir_convert_from_ssa, true); struct spirv_shader *spirv = nir_to_spirv(nir, sinfo, screen->spirv_version); - if (!spirv) - goto done; - - if (zink_debug & ZINK_DEBUG_SPIRV) { - char buf[256]; - static int i; - snprintf(buf, sizeof(buf), "dump%02d.spv", i++); - zink_shader_dump(spirv->words, spirv->num_words * sizeof(uint32_t), buf); - } - - VkShaderModuleCreateInfo smci = {0}; - smci.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - smci.codeSize = spirv->num_words * sizeof(uint32_t); - smci.pCode = spirv->words; - - if (VKSCR(CreateShaderModule)(screen->dev, &smci, NULL, &mod) != VK_SUCCESS) - mod = VK_NULL_HANDLE; + if (spirv) + mod = zink_shader_spirv_compile(screen, zs, spirv); -done: ralloc_free(nir); /* TODO: determine if there's any reason to cache spirv output? */ diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index 1303646..cb4d349 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -44,6 +44,7 @@ struct zink_screen; struct zink_shader_key; struct zink_shader_module; struct zink_gfx_program; +struct spirv_shader; struct nir_shader_compiler_options; struct nir_shader; @@ -104,7 +105,8 @@ void zink_compiler_assign_io(nir_shader *producer, nir_shader *consumer); VkShaderModule zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shader *nir, const struct zink_shader_key *key); - +VkShaderModule +zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, struct spirv_shader *spirv); struct zink_shader * zink_shader_create(struct zink_screen *screen, struct nir_shader *nir, const struct pipe_stream_output_info *so_info); -- 2.7.4