anv: Add a back-door for passing NIR shaders directly into the pipeline
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 23:16:57 +0000 (16:16 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 23:16:57 +0000 (16:16 -0700)
This will allow us to use NIR directly for meta operations rather than
having to go through SPIR-V.

src/vulkan/anv_compiler.cpp
src/vulkan/anv_pipeline.c
src/vulkan/anv_private.h

index 8acfc068e90ac3f0a4f993c228a38c40b89fa88a..b06775d05ca0cc4623ce218b9a74438e9e4ec654 100644 (file)
@@ -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,
index 833957a32e223c9b32b0a18ff4dbff7d0c96d40a..daf520f9714f79db2c2d034c24762d02daf9e6d8 100644 (file)
@@ -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);
 
index eb02f09e07f2e457892f380824f5fb92e846276e..f0d288342d6efbf62f97480f2681f125a323c8a8 100644 (file)
@@ -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];
 };