From add99c4beb3fc08e21bae4cd2e288deb8a2c26b9 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 2 Oct 2015 16:16:57 -0700 Subject: [PATCH] anv: Add a back-door for passing NIR shaders directly into the pipeline This will allow us to use NIR directly for meta operations rather than having to go through SPIR-V. --- src/vulkan/anv_compiler.cpp | 21 ++++++++++++++------- src/vulkan/anv_pipeline.c | 1 + src/vulkan/anv_private.h | 4 ++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/vulkan/anv_compiler.cpp b/src/vulkan/anv_compiler.cpp index 8acfc068e90..b06775d05ca 100644 --- a/src/vulkan/anv_compiler.cpp +++ b/src/vulkan/anv_compiler.cpp @@ -895,7 +895,6 @@ anv_compile_shader_spirv(struct anv_compiler *compiler, struct anv_shader *shader = pipeline->shaders[stage]; struct gl_shader *mesa_shader; int name = 0; - uint32_t *spirv; mesa_shader = brw_new_shader(&brw->ctx, name, stage_info[stage].token); fail_if(mesa_shader == NULL, @@ -937,13 +936,21 @@ anv_compile_shader_spirv(struct anv_compiler *compiler, struct gl_shader_compiler_options *glsl_options = &compiler->screen->compiler->glsl_compiler_options[stage_info[stage].stage]; - spirv = (uint32_t *) shader->module->data; - assert(spirv[0] == SPIR_V_MAGIC_NUMBER); - assert(shader->module->size % 4 == 0); + if (shader->module->nir) { + /* Some things such as our meta clear/blit code will give us a NIR + * shader directly. In that case, we just ignore the SPIR-V entirely + * and just use the NIR shader */ + mesa_shader->Program->nir = shader->module->nir; + mesa_shader->Program->nir->options = glsl_options->NirOptions; + } else { + uint32_t *spirv = (uint32_t *) shader->module->data; + assert(spirv[0] == SPIR_V_MAGIC_NUMBER); + assert(shader->module->size % 4 == 0); - mesa_shader->Program->nir = - spirv_to_nir(spirv, shader->module->size / 4, - stage_info[stage].stage, glsl_options->NirOptions); + mesa_shader->Program->nir = + spirv_to_nir(spirv, shader->module->size / 4, + stage_info[stage].stage, glsl_options->NirOptions); + } nir_validate_shader(mesa_shader->Program->nir); brw_process_nir(mesa_shader->Program->nir, diff --git a/src/vulkan/anv_pipeline.c b/src/vulkan/anv_pipeline.c index 833957a32e2..daf520f9714 100644 --- a/src/vulkan/anv_pipeline.c +++ b/src/vulkan/anv_pipeline.c @@ -47,6 +47,7 @@ VkResult anv_CreateShaderModule( if (module == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + module->nir = NULL; module->size = pCreateInfo->codeSize; memcpy(module->data, pCreateInfo->pCode, module->size); diff --git a/src/vulkan/anv_private.h b/src/vulkan/anv_private.h index eb02f09e07f..f0d288342d6 100644 --- a/src/vulkan/anv_private.h +++ b/src/vulkan/anv_private.h @@ -994,7 +994,11 @@ struct anv_fence { bool ready; }; +struct nir_shader; + struct anv_shader_module { + struct nir_shader * nir; + uint32_t size; char data[0]; }; -- 2.30.2