microsoft/compiler: Process signatures before the shader code

This lets us set up some metadata based on I/O vars without having
to do multiple passes over them.

Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Reviewed-By: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14837>
This commit is contained in:
Jesse Natalie 2022-02-01 14:36:32 -08:00 committed by Marge Bot
parent c154d403d3
commit efe5c2d6f3
1 changed files with 8 additions and 8 deletions

View File

@ -1517,7 +1517,7 @@ emit_tag(struct ntd_context *ctx, enum dxil_shader_tag tag,
}
static bool
emit_metadata(struct ntd_context *ctx)
emit_metadata(struct ntd_context *ctx, const struct dxil_mdnode *signatures)
{
unsigned dxilMinor = ctx->mod.minor_version;
if (!emit_llvm_ident(&ctx->mod) ||
@ -1587,12 +1587,6 @@ emit_metadata(struct ntd_context *ctx)
return false;
}
unsigned input_clip_size = ctx->mod.shader_kind == DXIL_PIXEL_SHADER ?
ctx->shader->info.clip_distance_array_size : ctx->opts->input_clip_size;
const struct dxil_mdnode *signatures = get_signatures(&ctx->mod, ctx->shader,
ctx->opts->environment == DXIL_ENVIRONMENT_VULKAN,
input_clip_size);
nir_function_impl *entry_func_impl = nir_shader_get_entrypoint(ctx->shader);
const struct dxil_mdnode *dx_entry_point = emit_entrypoint(ctx, main_func,
entry_func_impl->function->name, signatures, resources_node, shader_properties);
@ -5356,6 +5350,12 @@ emit_module(struct ntd_context *ctx, const struct nir_to_dxil_options *opts)
}
}
unsigned input_clip_size = ctx->mod.shader_kind == DXIL_PIXEL_SHADER ?
ctx->shader->info.clip_distance_array_size : ctx->opts->input_clip_size;
const struct dxil_mdnode *signatures = get_signatures(&ctx->mod, ctx->shader,
ctx->opts->environment == DXIL_ENVIRONMENT_VULKAN,
input_clip_size);
nir_foreach_function(func, ctx->shader) {
if (!emit_function(ctx, func))
return false;
@ -5372,7 +5372,7 @@ emit_module(struct ntd_context *ctx, const struct nir_to_dxil_options *opts)
if (ctx->mod.feats.native_low_precision)
ctx->mod.minor_version = MAX2(ctx->mod.minor_version, 2);
return emit_metadata(ctx) &&
return emit_metadata(ctx, signatures) &&
dxil_emit_module(&ctx->mod);
}