[Mesa-dev] [PATCH v2 68/73] ac/nir: pass ac_llvm_context to unpack_param

Nicolai Hähnle nhaehnle at gmail.com
Wed Jul 5 10:48:52 UTC 2017


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

---
 src/amd/common/ac_nir_to_llvm.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index f8eb0c9..9bb1904 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -482,42 +482,42 @@ static int get_elem_bits(struct ac_llvm_context *ctx, LLVMTypeRef type)
 	if (type == ctx->f16)
 		return 16;
 	if (type == ctx->f32)
 		return 32;
 	if (type == ctx->f64)
 		return 64;
 
 	unreachable("Unhandled type kind in get_elem_bits");
 }
 
-static LLVMValueRef unpack_param(struct nir_to_llvm_context *ctx,
+static LLVMValueRef unpack_param(struct ac_llvm_context *ctx,
 				 LLVMValueRef param, unsigned rshift,
 				 unsigned bitwidth)
 {
 	LLVMValueRef value = param;
 	if (rshift)
 		value = LLVMBuildLShr(ctx->builder, value,
 				      LLVMConstInt(ctx->i32, rshift, false), "");
 
 	if (rshift + bitwidth < 32) {
 		unsigned mask = (1 << bitwidth) - 1;
 		value = LLVMBuildAnd(ctx->builder, value,
 				     LLVMConstInt(ctx->i32, mask, false), "");
 	}
 	return value;
 }
 
 static LLVMValueRef get_rel_patch_id(struct nir_to_llvm_context *ctx)
 {
 	switch (ctx->stage) {
 	case MESA_SHADER_TESS_CTRL:
-		return unpack_param(ctx, ctx->tcs_rel_ids, 0, 8);
+		return unpack_param(&ctx->ac, ctx->tcs_rel_ids, 0, 8);
 	case MESA_SHADER_TESS_EVAL:
 		return ctx->tes_rel_patch_id;
 		break;
 	default:
 		unreachable("Illegal stage");
 	}
 }
 
 /* Tessellation shaders pass outputs to the next shader using LDS.
  *
@@ -536,48 +536,48 @@ static LLVMValueRef get_rel_patch_id(struct nir_to_llvm_context *ctx)
  * - TCS outputs for patch 2            = get_tcs_out_current_patch_offset (if RelPatchID==2)
  * - Per-patch TCS outputs for patch 2  = get_tcs_out_current_patch_data_offset (if RelPatchID==2)
  * - ...
  *
  * All three shaders VS(LS), TCS, TES share the same LDS space.
  */
 static LLVMValueRef
 get_tcs_in_patch_stride(struct nir_to_llvm_context *ctx)
 {
 	if (ctx->stage == MESA_SHADER_VERTEX)
-		return unpack_param(ctx, ctx->ls_out_layout, 0, 13);
+		return unpack_param(&ctx->ac, ctx->ls_out_layout, 0, 13);
 	else if (ctx->stage == MESA_SHADER_TESS_CTRL)
-		return unpack_param(ctx, ctx->tcs_in_layout, 0, 13);
+		return unpack_param(&ctx->ac, ctx->tcs_in_layout, 0, 13);
 	else {
 		assert(0);
 		return NULL;
 	}
 }
 
 static LLVMValueRef
 get_tcs_out_patch_stride(struct nir_to_llvm_context *ctx)
 {
-	return unpack_param(ctx, ctx->tcs_out_layout, 0, 13);
+	return unpack_param(&ctx->ac, ctx->tcs_out_layout, 0, 13);
 }
 
 static LLVMValueRef
 get_tcs_out_patch0_offset(struct nir_to_llvm_context *ctx)
 {
 	return LLVMBuildMul(ctx->builder,
-			    unpack_param(ctx, ctx->tcs_out_offsets, 0, 16),
+			    unpack_param(&ctx->ac, ctx->tcs_out_offsets, 0, 16),
 			    LLVMConstInt(ctx->i32, 4, false), "");
 }
 
 static LLVMValueRef
 get_tcs_out_patch0_patch_data_offset(struct nir_to_llvm_context *ctx)
 {
 	return LLVMBuildMul(ctx->builder,
-			    unpack_param(ctx, ctx->tcs_out_offsets, 16, 16),
+			    unpack_param(&ctx->ac, ctx->tcs_out_offsets, 16, 16),
 			    LLVMConstInt(ctx->i32, 4, false), "");
 }
 
 static LLVMValueRef
 get_tcs_in_current_patch_offset(struct nir_to_llvm_context *ctx)
 {
 	LLVMValueRef patch_stride = get_tcs_in_patch_stride(ctx);
 	LLVMValueRef rel_patch_id = get_rel_patch_id(ctx);
 
 	return LLVMBuildMul(ctx->builder, patch_stride, rel_patch_id, "");
@@ -2599,22 +2599,22 @@ lds_store(struct nir_to_llvm_context *ctx,
  * Note that every attribute has 4 components.
  */
 static LLVMValueRef get_tcs_tes_buffer_address(struct nir_to_llvm_context *ctx,
                                                LLVMValueRef vertex_index,
                                                LLVMValueRef param_index)
 {
 	LLVMValueRef base_addr, vertices_per_patch, num_patches, total_vertices;
 	LLVMValueRef param_stride, constant16;
 	LLVMValueRef rel_patch_id = get_rel_patch_id(ctx);
 
-	vertices_per_patch = unpack_param(ctx, ctx->tcs_offchip_layout, 9, 6);
-	num_patches = unpack_param(ctx, ctx->tcs_offchip_layout, 0, 9);
+	vertices_per_patch = unpack_param(&ctx->ac, ctx->tcs_offchip_layout, 9, 6);
+	num_patches = unpack_param(&ctx->ac, ctx->tcs_offchip_layout, 0, 9);
 	total_vertices = LLVMBuildMul(ctx->builder, vertices_per_patch,
 	                              num_patches, "");
 
 	constant16 = LLVMConstInt(ctx->i32, 16, false);
 	if (vertex_index) {
 		base_addr = LLVMBuildMul(ctx->builder, rel_patch_id,
 		                         vertices_per_patch, "");
 
 		base_addr = LLVMBuildAdd(ctx->builder, base_addr,
 		                         vertex_index, "");
@@ -2626,21 +2626,21 @@ static LLVMValueRef get_tcs_tes_buffer_address(struct nir_to_llvm_context *ctx,
 	}
 
 	base_addr = LLVMBuildAdd(ctx->builder, base_addr,
 	                         LLVMBuildMul(ctx->builder, param_index,
 	                                      param_stride, ""), "");
 
 	base_addr = LLVMBuildMul(ctx->builder, base_addr, constant16, "");
 
 	if (!vertex_index) {
 		LLVMValueRef patch_data_offset =
-		           unpack_param(ctx, ctx->tcs_offchip_layout, 16, 16);
+		           unpack_param(&ctx->ac, ctx->tcs_offchip_layout, 16, 16);
 
 		base_addr = LLVMBuildAdd(ctx->builder, base_addr,
 		                         patch_data_offset, "");
 	}
 	return base_addr;
 }
 
 static LLVMValueRef get_tcs_tes_buffer_address_params(struct nir_to_llvm_context *ctx,
 						      unsigned param,
 						      unsigned const_index,
@@ -2718,21 +2718,21 @@ load_tcs_input(struct nir_to_llvm_context *ctx,
 	LLVMValueRef indir_index;
 	unsigned param;
 	LLVMValueRef value[4], result;
 	const bool per_vertex = nir_is_per_vertex_io(instr->variables[0]->var, ctx->stage);
 	const bool is_compact = instr->variables[0]->var->data.compact;
 	param = shader_io_get_unique_index(instr->variables[0]->var->data.location);
 	get_deref_offset(ctx->nir, instr->variables[0],
 			 false, NULL, per_vertex ? &vertex_index : NULL,
 			 &const_index, &indir_index);
 
-	stride = unpack_param(ctx, ctx->tcs_in_layout, 13, 8);
+	stride = unpack_param(&ctx->ac, ctx->tcs_in_layout, 13, 8);
 	dw_addr = get_tcs_in_current_patch_offset(ctx);
 	dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, vertex_index, stride,
 				 indir_index);
 
 	for (unsigned i = 0; i < instr->num_components; i++) {
 		value[i] = lds_load(ctx, dw_addr);
 		dw_addr = LLVMBuildAdd(ctx->builder, dw_addr,
 				       ctx->i32one, "");
 	}
 	result = ac_build_gather_values(&ctx->ac, value, instr->num_components);
@@ -2751,21 +2751,21 @@ load_tcs_output(struct nir_to_llvm_context *ctx,
 	unsigned const_index = 0;
 	unsigned param;
 	const bool per_vertex = nir_is_per_vertex_io(instr->variables[0]->var, ctx->stage);
 	const bool is_compact = instr->variables[0]->var->data.compact;
 	param = shader_io_get_unique_index(instr->variables[0]->var->data.location);
 	get_deref_offset(ctx->nir, instr->variables[0],
 			 false, NULL, per_vertex ? &vertex_index : NULL,
 			 &const_index, &indir_index);
 
 	if (!instr->variables[0]->var->data.patch) {
-		stride = unpack_param(ctx, ctx->tcs_out_layout, 13, 8);
+		stride = unpack_param(&ctx->ac, ctx->tcs_out_layout, 13, 8);
 		dw_addr = get_tcs_out_current_patch_offset(ctx);
 	} else {
 		dw_addr = get_tcs_out_current_patch_data_offset(ctx);
 	}
 
 	dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, vertex_index, stride,
 				 indir_index);
 
 	for (unsigned i = 0; i < instr->num_components; i++) {
 		value[i] = lds_load(ctx, dw_addr);
@@ -2797,21 +2797,21 @@ store_tcs_output(struct nir_to_llvm_context *ctx,
 			 &const_index, &indir_index);
 
 	param = shader_io_get_unique_index(instr->variables[0]->var->data.location);
 	if (instr->variables[0]->var->data.location == VARYING_SLOT_CLIP_DIST0 &&
 	    is_compact && const_index > 3) {
 		const_index -= 3;
 		param++;
 	}
 
 	if (!instr->variables[0]->var->data.patch) {
-		stride = unpack_param(ctx, ctx->tcs_out_layout, 13, 8);
+		stride = unpack_param(&ctx->ac, ctx->tcs_out_layout, 13, 8);
 		dw_addr = get_tcs_out_current_patch_offset(ctx);
 	} else {
 		dw_addr = get_tcs_out_current_patch_data_offset(ctx);
 	}
 
 	mark_tess_output(ctx, instr->variables[0]->var->data.patch, param);
 
 	dw_addr = get_dw_address(ctx, dw_addr, param, const_index, is_compact, vertex_index, stride,
 				 indir_index);
 	buf_addr = get_tcs_tes_buffer_address_params(ctx, param, const_index, is_compact,
@@ -3953,39 +3953,39 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
 		break;
 	}
 	case nir_intrinsic_load_base_instance:
 		result = ctx->abi->start_instance;
 		break;
 	case nir_intrinsic_load_draw_id:
 		result = ctx->abi->draw_id;
 		break;
 	case nir_intrinsic_load_invocation_id:
 		if (ctx->stage == MESA_SHADER_TESS_CTRL)
-			result = unpack_param(ctx->nctx, ctx->nctx->tcs_rel_ids, 8, 5);
+			result = unpack_param(&ctx->ac, ctx->nctx->tcs_rel_ids, 8, 5);
 		else
 			result = ctx->nctx->gs_invocation_id;
 		break;
 	case nir_intrinsic_load_primitive_id:
 		if (ctx->stage == MESA_SHADER_GEOMETRY) {
 			ctx->nctx->shader_info->gs.uses_prim_id = true;
 			result = ctx->nctx->gs_prim_id;
 		} else if (ctx->stage == MESA_SHADER_TESS_CTRL) {
 			ctx->nctx->shader_info->tcs.uses_prim_id = true;
 			result = ctx->nctx->tcs_patch_id;
 		} else if (ctx->stage == MESA_SHADER_TESS_EVAL) {
 			ctx->nctx->shader_info->tcs.uses_prim_id = true;
 			result = ctx->nctx->tes_patch_id;
 		} else
 			fprintf(stderr, "Unknown primitive id intrinsic: %d", ctx->stage);
 		break;
 	case nir_intrinsic_load_sample_id:
-		result = unpack_param(ctx->nctx, ctx->abi->ancillary, 8, 4);
+		result = unpack_param(&ctx->ac, ctx->abi->ancillary, 8, 4);
 		break;
 	case nir_intrinsic_load_sample_pos:
 		result = load_sample_pos(ctx);
 		break;
 	case nir_intrinsic_load_sample_mask_in:
 		result = ctx->abi->sample_coverage;
 		break;
 	case nir_intrinsic_load_front_face:
 		result = ctx->abi->front_face;
 		break;
@@ -5509,21 +5509,21 @@ handle_es_outputs_post(struct nir_to_llvm_context *ctx,
 					       1, 1, true, true);
 		}
 	}
 	outinfo->esgs_itemsize = (max_output_written + 1) * 16;
 }
 
 static void
 handle_ls_outputs_post(struct nir_to_llvm_context *ctx)
 {
 	LLVMValueRef vertex_id = ctx->rel_auto_id;
-	LLVMValueRef vertex_dw_stride = unpack_param(ctx, ctx->ls_out_layout, 13, 8);
+	LLVMValueRef vertex_dw_stride = unpack_param(&ctx->ac, ctx->ls_out_layout, 13, 8);
 	LLVMValueRef base_dw_addr = LLVMBuildMul(ctx->builder, vertex_id,
 						 vertex_dw_stride, "");
 
 	for (unsigned i = 0; i < RADEON_LLVM_MAX_OUTPUTS; ++i) {
 		LLVMValueRef *out_ptr = &ctx->nir->outputs[i * 4];
 		int length = 4;
 
 		if (!(ctx->output_mask & (1ull << i)))
 			continue;
 
@@ -5633,22 +5633,22 @@ ac_nir_build_endif(struct ac_build_if_state *ifthen)
 
 	/* Resume building code at end of the ifthen->merge_block */
 	LLVMPositionBuilderAtEnd(builder, ifthen->merge_block);
 }
 
 static void
 write_tess_factors(struct nir_to_llvm_context *ctx)
 {
 	unsigned stride, outer_comps, inner_comps;
 	struct ac_build_if_state if_ctx, inner_if_ctx;
-	LLVMValueRef invocation_id = unpack_param(ctx, ctx->tcs_rel_ids, 8, 5);
-	LLVMValueRef rel_patch_id = unpack_param(ctx, ctx->tcs_rel_ids, 0, 8);
+	LLVMValueRef invocation_id = unpack_param(&ctx->ac, ctx->tcs_rel_ids, 8, 5);
+	LLVMValueRef rel_patch_id = unpack_param(&ctx->ac, ctx->tcs_rel_ids, 0, 8);
 	unsigned tess_inner_index, tess_outer_index;
 	LLVMValueRef lds_base, lds_inner, lds_outer, byteoffset, buffer;
 	LLVMValueRef out[6], vec0, vec1, tf_base, inner[4], outer[4];
 	int i;
 	emit_barrier(ctx);
 
 	switch (ctx->options->key.tcs.primitive_mode) {
 	case GL_ISOLINES:
 		stride = 2;
 		outer_comps = 2;
-- 
2.9.3



More information about the mesa-dev mailing list