[Mesa-dev] [PATCH v2 51/73] radeonsi/nir: perform lowering of input/output driver locations
Nicolai Hähnle
nhaehnle at gmail.com
Wed Jul 5 10:48:35 UTC 2017
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
---
src/gallium/drivers/radeonsi/si_shader.h | 1 +
src/gallium/drivers/radeonsi/si_shader_nir.c | 26 +++++++++++++++++++++++++
src/gallium/drivers/radeonsi/si_state_shaders.c | 2 ++
3 files changed, 29 insertions(+)
diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
index 339e156..e44d71c 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -628,20 +628,21 @@ void si_shader_apply_scratch_relocs(struct si_shader *shader,
void si_shader_binary_read_config(struct ac_shader_binary *binary,
struct si_shader_config *conf,
unsigned symbol_offset);
unsigned si_get_spi_shader_z_format(bool writes_z, bool writes_stencil,
bool writes_samplemask);
const char *si_get_shader_name(const struct si_shader *shader, unsigned processor);
/* si_shader_nir.c */
void si_nir_scan_shader(const struct nir_shader *nir,
struct tgsi_shader_info *info);
+void si_lower_nir(struct si_shader_selector *sel);
/* Inline helpers. */
/* Return the pointer to the main shader part's pointer. */
static inline struct si_shader **
si_get_main_shader_part(struct si_shader_selector *sel,
struct si_shader_key *key)
{
if (key->as_ls)
return &sel->main_shader_part_ls;
diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
index f02abab..dc2ef8b 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -306,20 +306,46 @@ void si_nir_scan_shader(const struct nir_shader *nir,
info->const_buffers_declared = u_bit_consecutive(0, SI_NUM_CONST_BUFFERS);
info->shader_buffers_declared = u_bit_consecutive(0, SI_NUM_SHADER_BUFFERS);
func = (struct nir_function *)exec_list_get_head_const(&nir->functions);
nir_foreach_block(block, func->impl) {
nir_foreach_instr(instr, block)
scan_instruction(info, instr);
}
}
+/**
+ * Perform "lowering" operations on the NIR that are run once when the shader
+ * selector is created.
+ */
+void
+si_lower_nir(struct si_shader_selector* sel)
+{
+ /* Adjust the driver location of inputs and outputs. The state tracker
+ * interprets them as slots, while the ac/nir backend interprets them
+ * as individual components.
+ */
+ nir_foreach_variable(variable, &sel->nir->inputs)
+ variable->data.driver_location *= 4;
+
+ nir_foreach_variable(variable, &sel->nir->outputs) {
+ variable->data.driver_location *= 4;
+
+ if (sel->nir->stage == MESA_SHADER_FRAGMENT) {
+ if (variable->data.location == FRAG_RESULT_DEPTH)
+ variable->data.driver_location += 2;
+ else if (variable->data.location == FRAG_RESULT_STENCIL)
+ variable->data.driver_location += 1;
+ }
+ }
+}
+
static void declare_nir_input_vs(struct si_shader_context *ctx,
struct nir_variable *variable, unsigned rel,
LLVMValueRef out[4])
{
si_llvm_load_input_vs(ctx, variable->data.driver_location / 4 + rel, out);
}
static void declare_nir_input_fs(struct si_shader_context *ctx,
struct nir_variable *variable, unsigned rel,
unsigned *fs_attr_idx,
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index df7ccb9..00818a5 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1982,20 +1982,22 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
return NULL;
}
tgsi_scan_shader(state->tokens, &sel->info);
} else {
assert(state->type == PIPE_SHADER_IR_NIR);
sel->nir = state->ir.nir;
si_nir_scan_shader(sel->nir, &sel->info);
+
+ si_lower_nir(sel);
}
sel->type = sel->info.processor;
p_atomic_inc(&sscreen->b.num_shaders_created);
si_get_active_slot_masks(&sel->info,
&sel->active_const_and_shader_buffers,
&sel->active_samplers_and_images);
/* Record which streamout buffers are enabled. */
for (i = 0; i < sel->so.num_outputs; i++) {
--
2.9.3
More information about the mesa-dev
mailing list