summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vulkan/anv_compiler.cpp21
-rw-r--r--src/vulkan/anv_pipeline.c1
-rw-r--r--src/vulkan/anv_private.h4
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];
};