From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 88 ++++++++++------------ .../drivers/radeonsi/si_shader_tgsi_setup.c | 14 ++-- 2 files changed, 47 insertions(+), 55 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 21efd9a..a5d370b 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -538,38 +538,38 @@ static void declare_input_vs( break; } } static LLVMValueRef get_primitive_id(struct lp_build_tgsi_context *bld_base, unsigned swizzle) { struct si_shader_context *ctx = si_shader_context(bld_base); if (swizzle > 0) - return bld_base->uint_bld.zero; + return ctx->i32_0; switch (ctx->type) { case PIPE_SHADER_VERTEX: return LLVMGetParam(ctx->main_fn, ctx->param_vs_prim_id); case PIPE_SHADER_TESS_CTRL: return LLVMGetParam(ctx->main_fn, SI_PARAM_PATCH_ID); case PIPE_SHADER_TESS_EVAL: return LLVMGetParam(ctx->main_fn, ctx->param_tes_patch_id); case PIPE_SHADER_GEOMETRY: return LLVMGetParam(ctx->main_fn, SI_PARAM_PRIMITIVE_ID); default: assert(0); - return bld_base->uint_bld.zero; + return ctx->i32_0; } } /** * Return the value of tgsi_ind_register for indexing. * This is the indirect index with the constant offset added to it. */ static LLVMValueRef get_indirect_index(struct si_shader_context *ctx, const struct tgsi_ind_register *ind, int rel_index) @@ -1096,28 +1096,28 @@ static LLVMValueRef fetch_input_gs( vtx_offset_param += SI_PARAM_VTX2_OFFSET - 2; } vtx_offset = lp_build_mul_imm(uint, LLVMGetParam(ctx->main_fn, vtx_offset_param), 4); param = si_shader_io_get_unique_index(semantic_name, semantic_index); soffset = LLVMConstInt(ctx->i32, (param * 4 + swizzle) * 256, 0); - value = ac_build_buffer_load(&ctx->ac, ctx->esgs_ring, 1, uint->zero, + value = ac_build_buffer_load(&ctx->ac, ctx->esgs_ring, 1, ctx->i32_0, vtx_offset, soffset, 0, 1, 0, true); if (tgsi_type_is_64bit(type)) { LLVMValueRef value2; soffset = LLVMConstInt(ctx->i32, (param * 4 + swizzle + 1) * 256, 0); value2 = ac_build_buffer_load(&ctx->ac, ctx->esgs_ring, 1, - uint->zero, vtx_offset, soffset, + ctx->i32_0, vtx_offset, soffset, 0, 1, 0, true); return si_llvm_emit_fetch_64bit(bld_base, type, value, value2); } return LLVMBuildBitCast(gallivm->builder, value, tgsi2llvmtype(bld_base, type), ""); } static int lookup_interp_param_index(unsigned interpolate, unsigned location) @@ -1169,21 +1169,20 @@ static void interp_fs_input(struct si_shader_context *ctx, unsigned semantic_index, unsigned num_interp_inputs, unsigned colors_read_mask, LLVMValueRef interp_param, LLVMValueRef prim_mask, LLVMValueRef face, LLVMValueRef result[4]) { struct lp_build_tgsi_context *bld_base = &ctx->bld_base; struct lp_build_context *base = &bld_base->base; - struct lp_build_context *uint = &bld_base->uint_bld; struct gallivm_state *gallivm = base->gallivm; LLVMValueRef attr_number; LLVMValueRef i, j; unsigned chan; /* fs.constant returns the param from the middle vertex, so it's not * really useful for flat shading. It's meant to be used for custom * interpolation (but the intrinsic can't fetch from the other two * vertices). @@ -1198,41 +1197,41 @@ static void interp_fs_input(struct si_shader_context *ctx, */ bool interp = interp_param != NULL; attr_number = LLVMConstInt(ctx->i32, input_index, 0); if (interp) { interp_param = LLVMBuildBitCast(gallivm->builder, interp_param, LLVMVectorType(ctx->f32, 2), ""); i = LLVMBuildExtractElement(gallivm->builder, interp_param, - uint->zero, ""); + ctx->i32_0, ""); j = LLVMBuildExtractElement(gallivm->builder, interp_param, - uint->one, ""); + ctx->i32_1, ""); } if (semantic_name == TGSI_SEMANTIC_COLOR && ctx->shader->key.part.ps.prolog.color_two_side) { LLVMValueRef is_face_positive; LLVMValueRef back_attr_number; /* If BCOLOR0 is used, BCOLOR1 is at offset "num_inputs + 1", * otherwise it's at offset "num_inputs". */ unsigned back_attr_offset = num_interp_inputs; if (semantic_index == 1 && colors_read_mask & 0xf) back_attr_offset += 1; back_attr_number = LLVMConstInt(ctx->i32, back_attr_offset, 0); is_face_positive = LLVMBuildICmp(gallivm->builder, LLVMIntNE, - face, uint->zero, ""); + face, ctx->i32_0, ""); for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { LLVMValueRef llvm_chan = LLVMConstInt(ctx->i32, chan, 0); LLVMValueRef front, back; if (interp) { front = ac_build_fs_interp(&ctx->ac, llvm_chan, attr_number, prim_mask, i, j); back = ac_build_fs_interp(&ctx->ac, llvm_chan, @@ -1248,24 +1247,24 @@ static void interp_fs_input(struct si_shader_context *ctx, } result[chan] = LLVMBuildSelect(gallivm->builder, is_face_positive, front, back, ""); } } else if (semantic_name == TGSI_SEMANTIC_FOG) { if (interp) { - result[0] = ac_build_fs_interp(&ctx->ac, uint->zero, + result[0] = ac_build_fs_interp(&ctx->ac, ctx->i32_0, attr_number, prim_mask, i, j); } else { - result[0] = ac_build_fs_interp_mov(&ctx->ac, uint->zero, + result[0] = ac_build_fs_interp_mov(&ctx->ac, ctx->i32_0, LLVMConstInt(ctx->i32, 2, 0), /* P0 */ attr_number, prim_mask); } result[1] = result[2] = LLVMConstReal(ctx->f32, 0.0f); result[3] = LLVMConstReal(ctx->f32, 1.0f); } else { for (chan = 0; chan < TGSI_NUM_CHANNELS; chan++) { LLVMValueRef llvm_chan = LLVMConstInt(ctx->i32, chan, 0); @@ -2306,21 +2305,21 @@ handle_semantic: pos_args[1].out[0] = psize_value; if (shader->selector->info.writes_edgeflag) { /* The output is a float, but the hw expects an integer * with the first bit containing the edge flag. */ edgeflag_value = LLVMBuildFPToUI(base->gallivm->builder, edgeflag_value, ctx->i32, ""); edgeflag_value = lp_build_min(&bld_base->int_bld, edgeflag_value, - bld_base->int_bld.one); + ctx->i32_1); /* The LLVM intrinsic expects a float. */ pos_args[1].out[1] = LLVMBuildBitCast(base->gallivm->builder, edgeflag_value, ctx->f32, ""); } if (shader->selector->info.writes_layer) pos_args[1].out[2] = layer_value; @@ -2412,21 +2411,21 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base, si_llvm_emit_barrier(NULL, bld_base, NULL); /* Do this only for invocation 0, because the tess levels are per-patch, * not per-vertex. * * This can't jump, because invocation 0 executes this. It should * at least mask out the loads and stores for other invocations. */ lp_build_if(&if_ctx, gallivm, LLVMBuildICmp(gallivm->builder, LLVMIntEQ, - invocation_id, bld_base->uint_bld.zero, "")); + invocation_id, ctx->i32_0, "")); /* Determine the layout of one tess factor element in the buffer. */ switch (shader->key.part.tcs.epilog.prim_mode) { case PIPE_PRIM_LINES: stride = 2; /* 2 dwords, 1 vec2 store */ outer_comps = 2; inner_comps = 0; break; case PIPE_PRIM_TRIANGLES: stride = 4; /* 4 dwords, 1 vec4 store */ @@ -2493,21 +2492,21 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base, LLVMConstInt(ctx->i32, SI_HS_RING_TESS_FACTOR, 0)); /* Get the offset. */ tf_base = LLVMGetParam(ctx->main_fn, SI_PARAM_TESS_FACTOR_OFFSET); byteoffset = LLVMBuildMul(gallivm->builder, rel_patch_id, LLVMConstInt(ctx->i32, 4 * stride, 0), ""); lp_build_if(&inner_if_ctx, gallivm, LLVMBuildICmp(gallivm->builder, LLVMIntEQ, - rel_patch_id, bld_base->uint_bld.zero, "")); + rel_patch_id, ctx->i32_0, "")); /* Store the dynamic HS control word. */ ac_build_buffer_store_dword(&ctx->ac, buffer, LLVMConstInt(ctx->i32, 0x80000000, 0), 1, ctx->i32_0, tf_base, 0, 1, 0, true, false); lp_build_endif(&inner_if_ctx); /* Store the tessellation factors. */ @@ -2575,23 +2574,23 @@ static void si_llvm_emit_tcs_epilogue(struct lp_build_tgsi_context *bld_base) LLVMValueRef ret = ctx->return_value; LLVMValueRef rw_buffers, rw0, rw1, tf_soffset; unsigned vgpr; /* RW_BUFFERS pointer */ rw_buffers = LLVMGetParam(ctx->main_fn, SI_PARAM_RW_BUFFERS); rw_buffers = LLVMBuildPtrToInt(builder, rw_buffers, ctx->i64, ""); rw_buffers = LLVMBuildBitCast(builder, rw_buffers, ctx->v2i32, ""); rw0 = LLVMBuildExtractElement(builder, rw_buffers, - bld_base->uint_bld.zero, ""); + ctx->i32_0, ""); rw1 = LLVMBuildExtractElement(builder, rw_buffers, - bld_base->uint_bld.one, ""); + ctx->i32_1, ""); ret = LLVMBuildInsertValue(builder, ret, rw0, 0, ""); ret = LLVMBuildInsertValue(builder, ret, rw1, 1, ""); /* Tess offchip and factor buffer soffset are after user SGPRs. */ offchip_layout = LLVMGetParam(ctx->main_fn, SI_PARAM_TCS_OFFCHIP_LAYOUT); offchip_soffset = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds); tf_soffset = LLVMGetParam(ctx->main_fn, SI_PARAM_TESS_FACTOR_OFFSET); ret = LLVMBuildInsertValue(builder, ret, offchip_layout, @@ -3314,25 +3313,25 @@ static LLVMValueRef image_fetch_coords( for (chan = 0; chan < num_coords; ++chan) { tmp = lp_build_emit_fetch(bld_base, inst, src, chan); tmp = LLVMBuildBitCast(builder, tmp, bld_base->uint_bld.elem_type, ""); coords[chan] = tmp; } /* 1D textures are allocated and used as 2D on GFX9. */ if (ctx->screen->b.chip_class >= GFX9) { if (target == TGSI_TEXTURE_1D) { - coords[1] = bld_base->uint_bld.zero; + coords[1] = ctx->i32_0; num_coords++; } else if (target == TGSI_TEXTURE_1D_ARRAY) { coords[2] = coords[1]; - coords[1] = bld_base->uint_bld.zero; + coords[1] = ctx->i32_0; } } if (num_coords == 1) return coords[0]; if (num_coords == 3) { /* LLVM has difficulties lowering 3-element vectors. */ coords[3] = bld_base->uint_bld.undef; num_coords = 4; @@ -3427,31 +3426,31 @@ static void load_fetch_args( if (inst->Src[0].Register.File == TGSI_FILE_BUFFER) { LLVMBuilderRef builder = gallivm->builder; LLVMValueRef offset; LLVMValueRef tmp; rsrc = shader_buffer_fetch_rsrc(ctx, &inst->Src[0]); tmp = lp_build_emit_fetch(bld_base, inst, 1, 0); offset = LLVMBuildBitCast(builder, tmp, bld_base->uint_bld.elem_type, ""); - buffer_append_args(ctx, emit_data, rsrc, bld_base->uint_bld.zero, + buffer_append_args(ctx, emit_data, rsrc, ctx->i32_0, offset, false, false); } else if (inst->Src[0].Register.File == TGSI_FILE_IMAGE) { LLVMValueRef coords; image_fetch_rsrc(bld_base, &inst->Src[0], false, target, &rsrc); coords = image_fetch_coords(bld_base, inst, 1); if (target == TGSI_TEXTURE_BUFFER) { buffer_append_args(ctx, emit_data, rsrc, coords, - bld_base->uint_bld.zero, false, false); + ctx->i32_0, false, false); } else { emit_data->args[0] = coords; emit_data->args[1] = rsrc; emit_data->args[2] = LLVMConstInt(ctx->i32, 15, 0); /* dmask */ emit_data->arg_count = 3; image_append_args(ctx, emit_data, target, false, false); } } } @@ -3695,61 +3694,60 @@ static void store_fetch_args( if (inst->Dst[0].Register.File == TGSI_FILE_BUFFER) { LLVMValueRef offset; LLVMValueRef tmp; rsrc = shader_buffer_fetch_rsrc(ctx, &memory); tmp = lp_build_emit_fetch(bld_base, inst, 0, 0); offset = LLVMBuildBitCast(builder, tmp, bld_base->uint_bld.elem_type, ""); - buffer_append_args(ctx, emit_data, rsrc, bld_base->uint_bld.zero, + buffer_append_args(ctx, emit_data, rsrc, ctx->i32_0, offset, false, false); } else if (inst->Dst[0].Register.File == TGSI_FILE_IMAGE) { unsigned target = inst->Memory.Texture; LLVMValueRef coords; /* 8bit/16bit TC L1 write corruption bug on SI. * All store opcodes not aligned to a dword are affected. * * The only way to get unaligned stores in radeonsi is through * shader images. */ bool force_glc = ctx->screen->b.chip_class == SI; coords = image_fetch_coords(bld_base, inst, 0); if (target == TGSI_TEXTURE_BUFFER) { image_fetch_rsrc(bld_base, &memory, true, target, &rsrc); buffer_append_args(ctx, emit_data, rsrc, coords, - bld_base->uint_bld.zero, false, force_glc); + ctx->i32_0, false, force_glc); } else { emit_data->args[1] = coords; image_fetch_rsrc(bld_base, &memory, true, target, &emit_data->args[2]); emit_data->args[3] = LLVMConstInt(ctx->i32, 15, 0); /* dmask */ emit_data->arg_count = 4; image_append_args(ctx, emit_data, target, false, force_glc); } } } static void store_emit_buffer( struct si_shader_context *ctx, struct lp_build_emit_data *emit_data, bool writeonly_memory) { const struct tgsi_full_instruction *inst = emit_data->inst; struct gallivm_state *gallivm = &ctx->gallivm; LLVMBuilderRef builder = gallivm->builder; - struct lp_build_context *uint_bld = &ctx->bld_base.uint_bld; LLVMValueRef base_data = emit_data->args[0]; LLVMValueRef base_offset = emit_data->args[3]; unsigned writemask = inst->Dst[0].Register.WriteMask; while (writemask) { int start, count; const char *intrinsic_name; LLVMValueRef data; LLVMValueRef offset; LLVMValueRef tmp; @@ -3767,27 +3765,27 @@ static void store_emit_buffer( data = base_data; intrinsic_name = "llvm.amdgcn.buffer.store.v4f32"; } else if (count == 2) { LLVMTypeRef v2f32 = LLVMVectorType(ctx->f32, 2); tmp = LLVMBuildExtractElement( builder, base_data, LLVMConstInt(ctx->i32, start, 0), ""); data = LLVMBuildInsertElement( builder, LLVMGetUndef(v2f32), tmp, - uint_bld->zero, ""); + ctx->i32_0, ""); tmp = LLVMBuildExtractElement( builder, base_data, LLVMConstInt(ctx->i32, start + 1, 0), ""); data = LLVMBuildInsertElement( - builder, data, tmp, uint_bld->one, ""); + builder, data, tmp, ctx->i32_1, ""); intrinsic_name = "llvm.amdgcn.buffer.store.v2f32"; } else { assert(count == 1); data = LLVMBuildExtractElement( builder, base_data, LLVMConstInt(ctx->i32, start, 0), ""); intrinsic_name = "llvm.amdgcn.buffer.store.f32"; } @@ -3917,32 +3915,32 @@ static void atomic_fetch_args( emit_data->args[emit_data->arg_count++] = data1; if (inst->Src[0].Register.File == TGSI_FILE_BUFFER) { LLVMValueRef offset; rsrc = shader_buffer_fetch_rsrc(ctx, &inst->Src[0]); tmp = lp_build_emit_fetch(bld_base, inst, 1, 0); offset = LLVMBuildBitCast(builder, tmp, bld_base->uint_bld.elem_type, ""); - buffer_append_args(ctx, emit_data, rsrc, bld_base->uint_bld.zero, + buffer_append_args(ctx, emit_data, rsrc, ctx->i32_0, offset, true, false); } else if (inst->Src[0].Register.File == TGSI_FILE_IMAGE) { unsigned target = inst->Memory.Texture; LLVMValueRef coords; image_fetch_rsrc(bld_base, &inst->Src[0], true, target, &rsrc); coords = image_fetch_coords(bld_base, inst, 1); if (target == TGSI_TEXTURE_BUFFER) { buffer_append_args(ctx, emit_data, rsrc, coords, - bld_base->uint_bld.zero, true, false); + ctx->i32_0, true, false); } else { emit_data->args[emit_data->arg_count++] = coords; emit_data->args[emit_data->arg_count++] = rsrc; image_append_args(ctx, emit_data, target, true, false); } } } static void atomic_emit_memory(struct si_shader_context *ctx, @@ -4139,21 +4137,21 @@ static void resq_fetch_args( unsigned image_target; if (inst->Memory.Texture == TGSI_TEXTURE_3D) image_target = TGSI_TEXTURE_2D_ARRAY; else image_target = inst->Memory.Texture; image_fetch_rsrc(bld_base, reg, false, inst->Memory.Texture, &res_ptr); set_tex_fetch_args(ctx, emit_data, image_target, - res_ptr, NULL, &bld_base->uint_bld.zero, 1, + res_ptr, NULL, &ctx->i32_0, 1, 0xf); } } static void resq_emit( const struct lp_build_tgsi_action *action, struct lp_build_tgsi_context *bld_base, struct lp_build_emit_data *emit_data) { struct si_shader_context *ctx = si_shader_context(bld_base); @@ -4372,21 +4370,21 @@ static void tex_fetch_args( bool has_offset = inst->Texture.NumOffsets > 0; LLVMValueRef res_ptr, samp_ptr, fmask_ptr = NULL; unsigned dmask = 0xf; tex_fetch_ptrs(bld_base, emit_data, &res_ptr, &samp_ptr, &fmask_ptr); if (target == TGSI_TEXTURE_BUFFER) { emit_data->dst_type = ctx->v4f32; emit_data->args[0] = LLVMBuildBitCast(gallivm->builder, res_ptr, ctx->v16i8, ""); - emit_data->args[1] = bld_base->uint_bld.zero; + emit_data->args[1] = ctx->i32_0; emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X); emit_data->arg_count = 3; return; } /* Fetch and project texture coordinates */ coords[3] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_W); for (chan = 0; chan < 3; chan++ ) { coords[chan] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, @@ -4538,21 +4536,21 @@ static void tex_fetch_args( address[count++] = coords[1]; if (num_coords > 2) address[count++] = coords[2]; /* 1D textures are allocated and used as 2D on GFX9. */ if (ctx->screen->b.chip_class >= GFX9) { LLVMValueRef filler; /* Use 0.5, so that we don't sample the border color. */ if (opcode == TGSI_OPCODE_TXF) - filler = bld_base->uint_bld.zero; + filler = ctx->i32_0; else filler = LLVMConstReal(ctx->f32, 0.5); if (target == TGSI_TEXTURE_1D || target == TGSI_TEXTURE_SHADOW1D) { address[count++] = filler; } else if (target == TGSI_TEXTURE_1D_ARRAY || target == TGSI_TEXTURE_SHADOW1D_ARRAY) { address[count] = address[count - 1]; address[count - 1] = filler; @@ -4585,21 +4583,20 @@ static void tex_fetch_args( * For example, 0x11111100 means there are only 2 samples stored and * the second sample covers 3/4 of the pixel. When reading samples 0 * and 1, return physical sample 0 (determined by the first two 0s * in FMASK), otherwise return physical sample 1. * * The sample index should be adjusted as follows: * sample_index = (fmask >> (sample_index * 4)) & 0xF; */ if (target == TGSI_TEXTURE_2D_MSAA || target == TGSI_TEXTURE_2D_ARRAY_MSAA) { - struct lp_build_context *uint_bld = &bld_base->uint_bld; struct lp_build_emit_data txf_emit_data = *emit_data; LLVMValueRef txf_address[4]; /* We only need .xy for non-arrays, and .xyz for arrays. */ unsigned txf_count = target == TGSI_TEXTURE_2D_MSAA ? 2 : 3; struct tgsi_full_instruction inst = {}; memcpy(txf_address, address, sizeof(txf_address)); /* Read FMASK using TXF_LZ. */ inst.Instruction.Opcode = TGSI_OPCODE_TXF_LZ; @@ -4612,21 +4609,21 @@ static void tex_fetch_args( build_tex_intrinsic(&tex_action, bld_base, &txf_emit_data); /* Initialize some constants. */ LLVMValueRef four = LLVMConstInt(ctx->i32, 4, 0); LLVMValueRef F = LLVMConstInt(ctx->i32, 0xF, 0); /* Apply the formula. */ LLVMValueRef fmask = LLVMBuildExtractElement(gallivm->builder, txf_emit_data.output[0], - uint_bld->zero, ""); + ctx->i32_0, ""); unsigned sample_chan = txf_count; /* the sample index is last */ LLVMValueRef sample_index4 = LLVMBuildMul(gallivm->builder, address[sample_chan], four, ""); LLVMValueRef shifted_fmask = LLVMBuildLShr(gallivm->builder, fmask, sample_index4, ""); LLVMValueRef final_sample = @@ -4634,25 +4631,25 @@ static void tex_fetch_args( /* Don't rewrite the sample index if WORD1.DATA_FORMAT of the FMASK * resource descriptor is 0 (invalid), */ LLVMValueRef fmask_desc = LLVMBuildBitCast(gallivm->builder, fmask_ptr, ctx->v8i32, ""); LLVMValueRef fmask_word1 = LLVMBuildExtractElement(gallivm->builder, fmask_desc, - uint_bld->one, ""); + ctx->i32_1, ""); LLVMValueRef word1_is_nonzero = LLVMBuildICmp(gallivm->builder, LLVMIntNE, - fmask_word1, uint_bld->zero, ""); + fmask_word1, ctx->i32_0, ""); /* Replace the MSAA sample index. */ address[sample_chan] = LLVMBuildSelect(gallivm->builder, word1_is_nonzero, final_sample, address[sample_chan], ""); } if (opcode == TGSI_OPCODE_TXF || opcode == TGSI_OPCODE_TXF_LZ) { /* add tex offsets */ @@ -4748,22 +4745,21 @@ static void si_lower_gather4_integer(struct si_shader_context *ctx, half_texel[0] = half_texel[1] = LLVMConstReal(ctx->f32, -0.5); } else { struct tgsi_full_instruction txq_inst = {}; struct lp_build_emit_data txq_emit_data = {}; /* Query the texture size. */ txq_inst.Texture.Texture = target; txq_emit_data.inst = &txq_inst; txq_emit_data.dst_type = ctx->v4i32; set_tex_fetch_args(ctx, &txq_emit_data, target, - args->resource, NULL, - &ctx->bld_base.uint_bld.zero, + args->resource, NULL, &ctx->i32_0, 1, 0xf); txq_emit(NULL, &ctx->bld_base, &txq_emit_data); /* Compute -0.5 / size. */ for (c = 0; c < 2; c++) { half_texel[c] = LLVMBuildExtractElement(builder, txq_emit_data.output[0], LLVMConstInt(ctx->i32, c, 0), ""); half_texel[c] = LLVMBuildUIToFP(builder, half_texel[c], ctx->f32, ""); half_texel[c] = @@ -5005,21 +5001,20 @@ static void interp_fetch_args( } } static void build_interp_intrinsic(const struct lp_build_tgsi_action *action, struct lp_build_tgsi_context *bld_base, struct lp_build_emit_data *emit_data) { struct si_shader_context *ctx = si_shader_context(bld_base); struct si_shader *shader = ctx->shader; struct gallivm_state *gallivm = bld_base->base.gallivm; - struct lp_build_context *uint = &bld_base->uint_bld; LLVMValueRef interp_param; const struct tgsi_full_instruction *inst = emit_data->inst; int input_index = inst->Src[0].Register.Index; int chan; int i; LLVMValueRef attr_number; LLVMValueRef params = LLVMGetParam(ctx->main_fn, SI_PARAM_PRIM_MASK); int interp_param_idx; unsigned interp = shader->selector->info.input_interpolate[input_index]; unsigned location; @@ -5084,23 +5079,23 @@ static void build_interp_intrinsic(const struct lp_build_tgsi_action *action, LLVMValueRef llvm_chan; unsigned schan; schan = tgsi_util_get_full_src_register_swizzle(&inst->Src[0], chan); llvm_chan = LLVMConstInt(ctx->i32, schan, 0); if (interp_param) { interp_param = LLVMBuildBitCast(gallivm->builder, interp_param, LLVMVectorType(ctx->f32, 2), ""); LLVMValueRef i = LLVMBuildExtractElement( - gallivm->builder, interp_param, uint->zero, ""); + gallivm->builder, interp_param, ctx->i32_0, ""); LLVMValueRef j = LLVMBuildExtractElement( - gallivm->builder, interp_param, uint->one, ""); + gallivm->builder, interp_param, ctx->i32_1, ""); emit_data->output[chan] = ac_build_fs_interp(&ctx->ac, llvm_chan, attr_number, params, i, j); } else { emit_data->output[chan] = ac_build_fs_interp_mov(&ctx->ac, LLVMConstInt(ctx->i32, 2, 0), /* P0 */ llvm_chan, attr_number, params); } } } @@ -5433,25 +5428,23 @@ static unsigned llvm_get_type_size(LLVMTypeRef type) llvm_get_type_size(LLVMGetElementType(type)); default: assert(0); return 0; } } static void declare_tess_lds(struct si_shader_context *ctx) { struct gallivm_state *gallivm = &ctx->gallivm; - struct lp_build_tgsi_context *bld_base = &ctx->bld_base; - struct lp_build_context *uint = &bld_base->uint_bld; unsigned lds_size = ctx->screen->b.chip_class >= CIK ? 65536 : 32768; - ctx->lds = LLVMBuildIntToPtr(gallivm->builder, uint->zero, + ctx->lds = LLVMBuildIntToPtr(gallivm->builder, ctx->i32_0, LLVMPointerType(LLVMArrayType(ctx->i32, lds_size / 4), LOCAL_ADDR_SPACE), "tess_lds"); } static unsigned si_get_max_workgroup_size(struct si_shader *shader) { const unsigned *properties = shader->selector->info.properties; unsigned max_work_group_size = properties[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH] * properties[TGSI_PROPERTY_CS_FIXED_BLOCK_HEIGHT] * @@ -5754,21 +5747,20 @@ static void preload_ring_buffers(struct si_shader_context *ctx) ac_build_indexed_load_const(&ctx->ac, buf_ptr, offset); } if (ctx->shader->is_gs_copy_shader) { LLVMValueRef offset = LLVMConstInt(ctx->i32, SI_RING_GSVS, 0); ctx->gsvs_ring[0] = ac_build_indexed_load_const(&ctx->ac, buf_ptr, offset); } else if (ctx->type == PIPE_SHADER_GEOMETRY) { const struct si_shader_selector *sel = ctx->shader->selector; - struct lp_build_context *uint = &ctx->bld_base.uint_bld; LLVMValueRef offset = LLVMConstInt(ctx->i32, SI_RING_GSVS, 0); LLVMValueRef base_ring; base_ring = ac_build_indexed_load_const(&ctx->ac, buf_ptr, offset); /* The conceptual layout of the GSVS ring is * v0c0 .. vLv0 v0c1 .. vLc1 .. * but the real memory layout is swizzled across * threads: * t0v0c0 .. t15v0c0 t0v1c0 .. t15v1c0 ... t15vLcL @@ -5789,34 +5781,34 @@ static void preload_ring_buffers(struct si_shader_context *ctx) continue; stride = 4 * num_components * sel->gs_max_out_vertices; /* Limit on the stride field for <= CIK. */ assert(stride < (1 << 14)); num_records = 64; ring = LLVMBuildBitCast(builder, base_ring, v2i64, ""); - tmp = LLVMBuildExtractElement(builder, ring, uint->zero, ""); + tmp = LLVMBuildExtractElement(builder, ring, ctx->i32_0, ""); tmp = LLVMBuildAdd(builder, tmp, LLVMConstInt(ctx->i64, stream_offset, 0), ""); stream_offset += stride * 64; - ring = LLVMBuildInsertElement(builder, ring, tmp, uint->zero, ""); + ring = LLVMBuildInsertElement(builder, ring, tmp, ctx->i32_0, ""); ring = LLVMBuildBitCast(builder, ring, ctx->v4i32, ""); - tmp = LLVMBuildExtractElement(builder, ring, uint->one, ""); + tmp = LLVMBuildExtractElement(builder, ring, ctx->i32_1, ""); tmp = LLVMBuildOr(builder, tmp, LLVMConstInt(ctx->i32, S_008F04_STRIDE(stride) | S_008F04_SWIZZLE_ENABLE(1), 0), ""); - ring = LLVMBuildInsertElement(builder, ring, tmp, uint->one, ""); + ring = LLVMBuildInsertElement(builder, ring, tmp, ctx->i32_1, ""); ring = LLVMBuildInsertElement(builder, ring, LLVMConstInt(ctx->i32, num_records, 0), LLVMConstInt(ctx->i32, 2, 0), ""); ring = LLVMBuildInsertElement(builder, ring, LLVMConstInt(ctx->i32, S_008F0C_DST_SEL_X(V_008F0C_SQ_SEL_X) | S_008F0C_DST_SEL_Y(V_008F0C_SQ_SEL_Y) | S_008F0C_DST_SEL_Z(V_008F0C_SQ_SEL_Z) | S_008F0C_DST_SEL_W(V_008F0C_SQ_SEL_W) | S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) | @@ -6371,21 +6363,21 @@ si_generate_gs_copy_shader(struct si_screen *sscreen, LLVMValueRef voffset = lp_build_mul_imm(uint, LLVMGetParam(ctx.main_fn, ctx.param_vertex_id), 4); /* Fetch the vertex stream ID.*/ LLVMValueRef stream_id; if (gs_selector->so.num_outputs) stream_id = unpack_param(&ctx, ctx.param_streamout_config, 24, 2); else - stream_id = uint->zero; + stream_id = ctx.i32_0; /* Fill in output information. */ for (i = 0; i < gsinfo->num_outputs; ++i) { outputs[i].semantic_name = gsinfo->output_semantic_name[i]; outputs[i].semantic_index = gsinfo->output_semantic_index[i]; for (int chan = 0; chan < 4; chan++) { outputs[i].vertex_stream[chan] = (gsinfo->output_streams[i] >> (2 * chan)) & 3; } @@ -6421,21 +6413,21 @@ si_generate_gs_copy_shader(struct si_screen *sscreen, continue; } LLVMValueRef soffset = LLVMConstInt(ctx.i32, offset * gs_selector->gs_max_out_vertices * 16 * 4, 0); offset++; outputs[i].values[chan] = ac_build_buffer_load(&ctx.ac, ctx.gsvs_ring[0], 1, - uint->zero, voffset, + ctx.i32_0, voffset, soffset, 0, 1, 1, true); } } /* Streamout and exports. */ if (gs_selector->so.num_outputs) { si_llvm_emit_streamout(&ctx, outputs, gsinfo->num_outputs, stream); } diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index f576a5e..3442a4b 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -491,21 +491,21 @@ get_pointer_into_array(struct si_shader_context *ctx, index = LLVMBuildMul( builder, index, LLVMConstInt(ctx->i32, util_bitcount(array->writemask), 0), ""); index = LLVMBuildAdd( builder, index, LLVMConstInt(ctx->i32, util_bitcount(array->writemask & ((1 << swizzle) - 1)), 0), ""); - idxs[0] = ctx->bld_base.uint_bld.zero; + idxs[0] = ctx->i32_0; idxs[1] = index; return LLVMBuildGEP(builder, alloca, idxs, 2, ""); } LLVMValueRef si_llvm_emit_fetch_64bit(struct lp_build_tgsi_context *bld_base, enum tgsi_opcode_type type, LLVMValueRef ptr, LLVMValueRef ptr2) { @@ -562,21 +562,21 @@ load_value_from_array(struct lp_build_tgsi_context *bld_base, struct si_shader_context *ctx = si_shader_context(bld_base); struct gallivm_state *gallivm = bld_base->base.gallivm; LLVMBuilderRef builder = gallivm->builder; LLVMValueRef ptr; ptr = get_pointer_into_array(ctx, file, swizzle, reg_index, reg_indirect); if (ptr) { LLVMValueRef val = LLVMBuildLoad(builder, ptr, ""); if (tgsi_type_is_64bit(type)) { LLVMValueRef ptr_hi, val_hi; - ptr_hi = LLVMBuildGEP(builder, ptr, &bld_base->uint_bld.one, 1, ""); + ptr_hi = LLVMBuildGEP(builder, ptr, &ctx->i32_1, 1, ""); val_hi = LLVMBuildLoad(builder, ptr_hi, ""); val = si_llvm_emit_fetch_64bit(bld_base, type, val, val_hi); } return val; } else { struct tgsi_declaration_range range = get_array_range(bld_base, file, reg_index, reg_indirect); LLVMValueRef index = emit_array_index(ctx, reg_indirect, reg_index - range.First); @@ -683,24 +683,24 @@ LLVMValueRef si_llvm_emit_fetch(struct lp_build_tgsi_context *bld_base, return bitcast(bld_base, type, load); } switch(reg->Register.File) { case TGSI_FILE_IMMEDIATE: { LLVMTypeRef ctype = tgsi2llvmtype(bld_base, type); if (tgsi_type_is_64bit(type)) { result = LLVMGetUndef(LLVMVectorType(LLVMIntTypeInContext(bld_base->base.gallivm->context, 32), bld_base->base.type.length * 2)); result = LLVMConstInsertElement(result, ctx->imms[reg->Register.Index * TGSI_NUM_CHANNELS + swizzle], - bld_base->int_bld.zero); + ctx->i32_0); result = LLVMConstInsertElement(result, ctx->imms[reg->Register.Index * TGSI_NUM_CHANNELS + swizzle + 1], - bld_base->int_bld.one); + ctx->i32_1); return LLVMConstBitCast(result, ctype); } else { return LLVMConstBitCast(ctx->imms[reg->Register.Index * TGSI_NUM_CHANNELS + swizzle], ctype); } } case TGSI_FILE_INPUT: { unsigned index = reg->Register.Index; LLVMValueRef input[4]; @@ -852,21 +852,21 @@ static void emit_declaration(struct lp_build_tgsi_context *bld_base, snprintf(name, sizeof(name), "TEMP%d.%c", first + i / 4, "xyzw"[i % 4]); #endif ctx->temps[first * TGSI_NUM_CHANNELS + i] = lp_build_alloca_undef(bld_base->base.gallivm, bld_base->base.vec_type, name); } } else { LLVMValueRef idxs[2] = { - bld_base->uint_bld.zero, + ctx->i32_0, NULL }; unsigned j = 0; if (writemask != TGSI_WRITEMASK_XYZW && !ctx->undef_alloca) { /* Create a dummy alloca. We use it so that we * have a pointer that is safe to load from if * a shader ever reads from a channel that * it never writes to. @@ -1028,23 +1028,23 @@ void si_llvm_emit_store(struct lp_build_tgsi_context *bld_base, default: return; } if (!tgsi_type_is_64bit(dtype)) LLVMBuildStore(builder, value, temp_ptr); else { LLVMValueRef ptr = LLVMBuildBitCast(builder, value, LLVMVectorType(LLVMIntTypeInContext(bld_base->base.gallivm->context, 32), 2), ""); LLVMValueRef val2; value = LLVMBuildExtractElement(builder, ptr, - bld_base->uint_bld.zero, ""); + ctx->i32_0, ""); val2 = LLVMBuildExtractElement(builder, ptr, - bld_base->uint_bld.one, ""); + ctx->i32_1, ""); LLVMBuildStore(builder, bitcast(bld_base, TGSI_TYPE_FLOAT, value), temp_ptr); LLVMBuildStore(builder, bitcast(bld_base, TGSI_TYPE_FLOAT, val2), temp_ptr2); } } } } static void set_basicblock_name(LLVMBasicBlockRef bb, const char *base, int pc) { -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev