[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