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.
This commit is contained in:
Jason Ekstrand 2015-10-02 16:16:57 -07:00
parent b68805f83c
commit add99c4beb
3 changed files with 19 additions and 7 deletions

View 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,

View 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);

View 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];
};