[Mesa-dev] [PATCH 20/31] radv/ac: add geom input support to get deref offset.

Dave Airlie airlied at gmail.com
Fri Jan 20 03:03:16 UTC 2017


From: Dave Airlie <airlied at redhat.com>

This just adds the API and fixes up the callers.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/amd/common/ac_nir_to_llvm.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 21eeff0..10ad831 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -2084,11 +2084,17 @@ static LLVMValueRef visit_load_ubo_buffer(struct nir_to_llvm_context *ctx,
 
 static void
 radv_get_deref_offset(struct nir_to_llvm_context *ctx, nir_deref *tail,
-                      bool vs_in, unsigned *const_out, LLVMValueRef *indir_out)
+		      bool vs_in, unsigned *vertex_index_out,
+		      unsigned *const_out, LLVMValueRef *indir_out)
 {
 	unsigned const_offset = 0;
 	LLVMValueRef offset = NULL;
 
+	if (vertex_index_out != NULL) {
+		tail = tail->child;
+		nir_deref_array *deref_array = nir_deref_as_array(tail);
+		*vertex_index_out = deref_array->base_offset;
+	}
 
 	while (tail->child != NULL) {
 		const struct glsl_type *parent_type = tail->type;
@@ -2144,7 +2150,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx,
 	switch (instr->variables[0]->var->data.mode) {
 	case nir_var_shader_in:
 		radv_get_deref_offset(ctx, &instr->variables[0]->deref,
-				      ctx->stage == MESA_SHADER_VERTEX,
+				      ctx->stage == MESA_SHADER_VERTEX, NULL,
 				      &const_index, &indir_index);
 		for (unsigned chan = 0; chan < ve; chan++) {
 			if (indir_index) {
@@ -2165,7 +2171,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx,
 		break;
 	case nir_var_local:
 		radv_get_deref_offset(ctx, &instr->variables[0]->deref, false,
-				      &const_index, &indir_index);
+				      NULL, &const_index, &indir_index);
 		for (unsigned chan = 0; chan < ve; chan++) {
 			if (indir_index) {
 				unsigned count = glsl_count_attribute_slots(
@@ -2184,7 +2190,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx,
 		return to_integer(ctx, ac_build_gather_values(&ctx->ac, values, ve));
 	case nir_var_shader_out:
 		radv_get_deref_offset(ctx, &instr->variables[0]->deref, false,
-				      &const_index, &indir_index);
+				      NULL, &const_index, &indir_index);
 		for (unsigned chan = 0; chan < ve; chan++) {
 			if (indir_index) {
 				unsigned count = glsl_count_attribute_slots(
@@ -2205,7 +2211,7 @@ static LLVMValueRef visit_load_var(struct nir_to_llvm_context *ctx,
 		return to_integer(ctx, ac_build_gather_values(&ctx->ac, values, ve));
 	case nir_var_shared: {
 		radv_get_deref_offset(ctx, &instr->variables[0]->deref, false,
-				      &const_index, &indir_index);
+				      NULL, &const_index, &indir_index);
 		LLVMValueRef ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
 		LLVMValueRef derived_ptr;
 
@@ -2237,7 +2243,7 @@ visit_store_var(struct nir_to_llvm_context *ctx,
 	switch (instr->variables[0]->var->data.mode) {
 	case nir_var_shader_out:
 		radv_get_deref_offset(ctx, &instr->variables[0]->deref, false,
-				      &const_index, &indir_index);
+				      NULL, &const_index, &indir_index);
 		for (unsigned chan = 0; chan < 4; chan++) {
 			int stride = 4;
 			if (!(writemask & (1 << chan)))
@@ -2277,7 +2283,7 @@ visit_store_var(struct nir_to_llvm_context *ctx,
 		break;
 	case nir_var_local:
 		radv_get_deref_offset(ctx, &instr->variables[0]->deref, false,
-				      &const_index, &indir_index);
+				      NULL, &const_index, &indir_index);
 		for (unsigned chan = 0; chan < 4; chan++) {
 			if (!(writemask & (1 << chan)))
 				continue;
@@ -2308,7 +2314,7 @@ visit_store_var(struct nir_to_llvm_context *ctx,
 	case nir_var_shared: {
 		LLVMValueRef ptr;
 		radv_get_deref_offset(ctx, &instr->variables[0]->deref, false,
-				      &const_index, &indir_index);
+				      NULL, &const_index, &indir_index);
 
 		ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
 		LLVMValueRef derived_ptr;
-- 
2.9.3



More information about the mesa-dev mailing list