On Thu, Sep 03, 2015 at 06:28:07PM +0200, Marek Olšák wrote: > Sadly, this patch requires LLVM 3.5, which I didn't realize. Would it > be okay to remove LLVM 3.4.2 support? >
Yes, that would be fine. -Tom > Marek > > On Wed, Sep 2, 2015 at 7:48 PM, Tom Stellard <t...@stellard.net> wrote: > > On Tue, Sep 01, 2015 at 11:18:15PM +0200, Marek Olšák wrote: > >> From: Marek Olšák <marek.ol...@amd.com> > >> > > > > Reviewed-by: Tom Stellard <thomas.stell...@amd.com> > >> Just a cleanup I had made a long time ago and forgot about. > >> --- > >> src/gallium/drivers/radeonsi/si_shader.c | 468 > >> +++++++++++++------------------ > >> 1 file changed, 191 insertions(+), 277 deletions(-) > >> > >> diff --git a/src/gallium/drivers/radeonsi/si_shader.c > >> b/src/gallium/drivers/radeonsi/si_shader.c > >> index ab5b3ee..7550a42 100644 > >> --- a/src/gallium/drivers/radeonsi/si_shader.c > >> +++ b/src/gallium/drivers/radeonsi/si_shader.c > >> @@ -2256,6 +2256,64 @@ static bool tgsi_is_shadow_sampler(unsigned target) > >> target == TGSI_TEXTURE_SHADOWRECT; > >> } > >> > >> +static bool tgsi_is_array_sampler(unsigned target) > >> +{ > >> + return target == TGSI_TEXTURE_1D_ARRAY || > >> + target == TGSI_TEXTURE_SHADOW1D_ARRAY || > >> + target == TGSI_TEXTURE_2D_ARRAY || > >> + target == TGSI_TEXTURE_SHADOW2D_ARRAY || > >> + target == TGSI_TEXTURE_CUBE_ARRAY || > >> + target == TGSI_TEXTURE_SHADOWCUBE_ARRAY || > >> + target == TGSI_TEXTURE_2D_ARRAY_MSAA; > >> +} > >> + > >> +static void set_tex_fetch_args(struct gallivm_state *gallivm, > >> + struct lp_build_emit_data *emit_data, > >> + unsigned opcode, unsigned target, > >> + LLVMValueRef res_ptr, LLVMValueRef samp_ptr, > >> + LLVMValueRef *param, unsigned count, > >> + unsigned dmask) > >> +{ > >> + unsigned num_args; > >> + unsigned is_rect = target == TGSI_TEXTURE_RECT; > >> + LLVMTypeRef i32 = LLVMInt32TypeInContext(gallivm->context); > >> + > >> + /* Pad to power of two vector */ > >> + while (count < util_next_power_of_two(count)) > >> + param[count++] = LLVMGetUndef(i32); > >> + > >> + /* Texture coordinates. */ > >> + if (count > 1) > >> + emit_data->args[0] = lp_build_gather_values(gallivm, param, > >> count); > >> + else > >> + emit_data->args[0] = param[0]; > >> + > >> + /* Resource. */ > >> + emit_data->args[1] = res_ptr; > >> + num_args = 2; > >> + > >> + if (opcode == TGSI_OPCODE_TXF || opcode == TGSI_OPCODE_TXQ) > >> + emit_data->dst_type = LLVMVectorType(i32, 4); > >> + else { > >> + emit_data->dst_type = LLVMVectorType( > >> + LLVMFloatTypeInContext(gallivm->context), 4); > >> + > >> + emit_data->args[num_args++] = samp_ptr; > >> + } > >> + > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, dmask); > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, > >> is_rect); /* unorm */ > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, 0); /* > >> r128 */ > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, > >> + tgsi_is_array_sampler(target)); /* > >> da */ > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, 0); /* > >> glc */ > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, 0); /* > >> slc */ > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, 0); /* > >> tfe */ > >> + emit_data->args[num_args++] = lp_build_const_int32(gallivm, 0); /* > >> lwe */ > >> + > >> + emit_data->arg_count = num_args; > >> +} > >> + > >> static const struct lp_build_tgsi_action tex_action; > >> > >> static void tex_fetch_args( > >> @@ -2264,6 +2322,7 @@ static void tex_fetch_args( > >> { > >> struct si_shader_context *si_shader_ctx = > >> si_shader_context(bld_base); > >> struct gallivm_state *gallivm = bld_base->base.gallivm; > >> + LLVMBuilderRef builder = gallivm->builder; > >> const struct tgsi_full_instruction * inst = emit_data->inst; > >> unsigned opcode = inst->Instruction.Opcode; > >> unsigned target = inst->Texture.Texture; > >> @@ -2278,6 +2337,8 @@ static void tex_fetch_args( > >> unsigned num_deriv_channels = 0; > >> bool has_offset = HAVE_LLVM >= 0x0305 ? inst->Texture.NumOffsets > 0 > >> : false; > >> LLVMValueRef res_ptr, samp_ptr, fmask_ptr = NULL; > >> + LLVMTypeRef i32 = LLVMInt32TypeInContext(gallivm->context); > >> + unsigned dmask = 0xf; > >> > >> sampler_src = emit_data->inst->Instruction.NumSrcRegs - 1; > >> sampler_index = emit_data->inst->Src[sampler_src].Register.Index; > >> @@ -2308,6 +2369,43 @@ static void tex_fetch_args( > >> fmask_ptr = si_shader_ctx->resources[SI_FMASK_TEX_OFFSET + > >> sampler_index]; > >> } > >> > >> + if (opcode == TGSI_OPCODE_TXQ) { > >> + if (target == TGSI_TEXTURE_BUFFER) { > >> + LLVMTypeRef v8i32 = LLVMVectorType(i32, 8); > >> + > >> + /* Read the size from the buffer descriptor > >> directly. */ > >> + LLVMValueRef res = LLVMBuildBitCast(builder, > >> res_ptr, v8i32, ""); > >> + LLVMValueRef size = LLVMBuildExtractElement(builder, > >> res, > >> + > >> lp_build_const_int32(gallivm, 6), ""); > >> + > >> + if (si_shader_ctx->screen->b.chip_class >= VI) { > >> + /* On VI, the descriptor contains the size > >> in bytes, > >> + * but TXQ must return the size in elements. > >> + * The stride is always non-zero for > >> resources using TXQ. > >> + */ > >> + LLVMValueRef stride = > >> + LLVMBuildExtractElement(builder, res, > >> + > >> lp_build_const_int32(gallivm, 5), ""); > >> + stride = LLVMBuildLShr(builder, stride, > >> + > >> lp_build_const_int32(gallivm, 16), ""); > >> + stride = LLVMBuildAnd(builder, stride, > >> + > >> lp_build_const_int32(gallivm, 0x3FFF), ""); > >> + > >> + size = LLVMBuildUDiv(builder, size, stride, > >> ""); > >> + } > >> + > >> + emit_data->args[0] = size; > >> + return; > >> + } > >> + > >> + /* Textures - set the mip level. */ > >> + address[count++] = lp_build_emit_fetch(bld_base, inst, 0, > >> TGSI_CHAN_X); > >> + > >> + set_tex_fetch_args(gallivm, emit_data, opcode, target, > >> res_ptr, > >> + NULL, address, count, 0xf); > >> + return; > >> + } > >> + > >> if (target == TGSI_TEXTURE_BUFFER) { > >> LLVMTypeRef i128 = LLVMIntTypeInContext(gallivm->context, > >> 128); > >> LLVMTypeRef v2i128 = LLVMVectorType(i128, 2); > >> @@ -2457,9 +2555,7 @@ static void tex_fetch_args( > >> > >> for (chan = 0; chan < count; chan++ ) { > >> address[chan] = LLVMBuildBitCast(gallivm->builder, > >> - address[chan], > >> - > >> LLVMInt32TypeInContext(gallivm->context), > >> - ""); > >> + address[chan], i32, ""); > >> } > >> > >> /* Adjust the sample index according to FMASK. > >> @@ -2491,22 +2587,14 @@ static void tex_fetch_args( > >> } > >> txf_address[3] = bld_base->uint_bld.zero; > >> > >> - /* Pad to a power-of-two size. */ > >> - while (txf_count < util_next_power_of_two(txf_count)) > >> - txf_address[txf_count++] = > >> LLVMGetUndef(LLVMInt32TypeInContext(gallivm->context)); > >> - > >> /* Read FMASK using TXF. */ > >> inst.Instruction.Opcode = TGSI_OPCODE_TXF; > >> - inst.Texture.Texture = target == TGSI_TEXTURE_2D_MSAA ? > >> TGSI_TEXTURE_2D : TGSI_TEXTURE_2D_ARRAY; > >> + inst.Texture.Texture = target; > >> txf_emit_data.inst = &inst; > >> txf_emit_data.chan = 0; > >> - txf_emit_data.dst_type = LLVMVectorType( > >> - LLVMInt32TypeInContext(gallivm->context), 4); > >> - txf_emit_data.args[0] = lp_build_gather_values(gallivm, > >> txf_address, txf_count); > >> - txf_emit_data.args[1] = fmask_ptr; > >> - txf_emit_data.args[2] = lp_build_const_int32(gallivm, > >> inst.Texture.Texture); > >> - txf_emit_data.arg_count = 3; > >> - > >> + set_tex_fetch_args(gallivm, &txf_emit_data, TGSI_OPCODE_TXF, > >> + target, fmask_ptr, NULL, > >> + txf_address, txf_count, 0xf); > >> build_tex_intrinsic(&tex_action, bld_base, &txf_emit_data); > >> > >> /* Initialize some constants. */ > >> @@ -2551,9 +2639,6 @@ static void tex_fetch_args( > >> final_sample, address[sample_chan], > >> ""); > >> } > >> > >> - /* Resource */ > >> - emit_data->args[1] = res_ptr; > >> - > >> if (opcode == TGSI_OPCODE_TXF) { > >> /* add tex offsets */ > >> if (inst->Texture.NumOffsets) { > >> @@ -2589,89 +2674,37 @@ static void tex_fetch_args( > >> /* texture offsets do not apply to other > >> texture targets */ > >> } > >> } > >> + } > >> > >> - emit_data->args[2] = lp_build_const_int32(gallivm, target); > >> - emit_data->arg_count = 3; > >> - > >> - emit_data->dst_type = LLVMVectorType( > >> - LLVMInt32TypeInContext(gallivm->context), > >> - 4); > >> - } else if (opcode == TGSI_OPCODE_TG4 || > >> - opcode == TGSI_OPCODE_LODQ || > >> - has_offset) { > >> - unsigned is_array = target == TGSI_TEXTURE_1D_ARRAY || > >> - target == TGSI_TEXTURE_SHADOW1D_ARRAY || > >> - target == TGSI_TEXTURE_2D_ARRAY || > >> - target == TGSI_TEXTURE_SHADOW2D_ARRAY || > >> - target == TGSI_TEXTURE_CUBE_ARRAY || > >> - target == TGSI_TEXTURE_SHADOWCUBE_ARRAY; > >> - unsigned is_rect = target == TGSI_TEXTURE_RECT; > >> - unsigned dmask = 0xf; > >> - > >> - if (opcode == TGSI_OPCODE_TG4) { > >> - unsigned gather_comp = 0; > >> - > >> - /* DMASK was repurposed for GATHER4. 4 components > >> are always > >> - * returned and DMASK works like a swizzle - it > >> selects > >> - * the component to fetch. The only valid DMASK > >> values are > >> - * 1=red, 2=green, 4=blue, 8=alpha. (e.g. 1 returns > >> - * (red,red,red,red) etc.) The ISA document doesn't > >> mention > >> - * this. > >> - */ > >> + if (opcode == TGSI_OPCODE_TG4) { > >> + unsigned gather_comp = 0; > >> > >> - /* Get the component index from src1.x for Gather4. > >> */ > >> - if (!tgsi_is_shadow_sampler(target)) { > >> - LLVMValueRef (*imms)[4] = > >> lp_soa_context(bld_base)->immediates; > >> - LLVMValueRef comp_imm; > >> - struct tgsi_src_register src1 = > >> inst->Src[1].Register; > >> + /* DMASK was repurposed for GATHER4. 4 components are always > >> + * returned and DMASK works like a swizzle - it selects > >> + * the component to fetch. The only valid DMASK values are > >> + * 1=red, 2=green, 4=blue, 8=alpha. (e.g. 1 returns > >> + * (red,red,red,red) etc.) The ISA document doesn't mention > >> + * this. > >> + */ > >> > >> - assert(src1.File == TGSI_FILE_IMMEDIATE); > >> + /* Get the component index from src1.x for Gather4. */ > >> + if (!tgsi_is_shadow_sampler(target)) { > >> + LLVMValueRef (*imms)[4] = > >> lp_soa_context(bld_base)->immediates; > >> + LLVMValueRef comp_imm; > >> + struct tgsi_src_register src1 = > >> inst->Src[1].Register; > >> > >> - comp_imm = imms[src1.Index][src1.SwizzleX]; > >> - gather_comp = > >> LLVMConstIntGetZExtValue(comp_imm); > >> - gather_comp = CLAMP(gather_comp, 0, 3); > >> - } > >> + assert(src1.File == TGSI_FILE_IMMEDIATE); > >> > >> - dmask = 1 << gather_comp; > >> + comp_imm = imms[src1.Index][src1.SwizzleX]; > >> + gather_comp = LLVMConstIntGetZExtValue(comp_imm); > >> + gather_comp = CLAMP(gather_comp, 0, 3); > >> } > >> > >> - emit_data->args[2] = samp_ptr; > >> - emit_data->args[3] = lp_build_const_int32(gallivm, dmask); > >> - emit_data->args[4] = lp_build_const_int32(gallivm, is_rect); > >> /* unorm */ > >> - emit_data->args[5] = lp_build_const_int32(gallivm, 0); /* > >> r128 */ > >> - emit_data->args[6] = lp_build_const_int32(gallivm, > >> is_array); /* da */ > >> - emit_data->args[7] = lp_build_const_int32(gallivm, 0); /* > >> glc */ > >> - emit_data->args[8] = lp_build_const_int32(gallivm, 0); /* > >> slc */ > >> - emit_data->args[9] = lp_build_const_int32(gallivm, 0); /* > >> tfe */ > >> - emit_data->args[10] = lp_build_const_int32(gallivm, 0); /* > >> lwe */ > >> - > >> - emit_data->arg_count = 11; > >> - > >> - emit_data->dst_type = LLVMVectorType( > >> - LLVMFloatTypeInContext(gallivm->context), > >> - 4); > >> - } else { > >> - emit_data->args[2] = samp_ptr; > >> - emit_data->args[3] = lp_build_const_int32(gallivm, target); > >> - emit_data->arg_count = 4; > >> - > >> - emit_data->dst_type = LLVMVectorType( > >> - LLVMFloatTypeInContext(gallivm->context), > >> - 4); > >> + dmask = 1 << gather_comp; > >> } > >> > >> - /* The fetch opcode has been converted to a 2D array fetch. > >> - * This simplifies the LLVM backend. */ > >> - if (target == TGSI_TEXTURE_CUBE_ARRAY) > >> - target = TGSI_TEXTURE_2D_ARRAY; > >> - else if (target == TGSI_TEXTURE_SHADOWCUBE_ARRAY) > >> - target = TGSI_TEXTURE_SHADOW2D_ARRAY; > >> - > >> - /* Pad to power of two vector */ > >> - while (count < util_next_power_of_two(count)) > >> - address[count++] = > >> LLVMGetUndef(LLVMInt32TypeInContext(gallivm->context)); > >> - > >> - emit_data->args[0] = lp_build_gather_values(gallivm, address, count); > >> + set_tex_fetch_args(gallivm, emit_data, opcode, target, res_ptr, > >> + samp_ptr, address, count, dmask); > >> } > >> > >> static void build_tex_intrinsic(const struct lp_build_tgsi_action * > >> action, > >> @@ -2684,6 +2717,16 @@ static void build_tex_intrinsic(const struct > >> lp_build_tgsi_action * action, > >> char intr_name[127]; > >> bool has_offset = HAVE_LLVM >= 0x0305 ? > >> emit_data->inst->Texture.NumOffsets > 0 : > >> false; > >> + bool is_shadow = tgsi_is_shadow_sampler(target); > >> + char type[64]; > >> + const char *name = "llvm.SI.image.sample"; > >> + const char *infix = ""; > >> + > >> + if (opcode == TGSI_OPCODE_TXQ && target == TGSI_TEXTURE_BUFFER) { > >> + /* Just return the buffer size. */ > >> + emit_data->output[emit_data->chan] = emit_data->args[0]; > >> + return; > >> + } > >> > >> if (target == TGSI_TEXTURE_BUFFER) { > >> emit_data->output[emit_data->chan] = lp_build_intrinsic( > >> @@ -2694,191 +2737,68 @@ static void build_tex_intrinsic(const struct > >> lp_build_tgsi_action * action, > >> return; > >> } > >> > >> - if (opcode == TGSI_OPCODE_TG4 || > >> - opcode == TGSI_OPCODE_LODQ || > >> - (opcode != TGSI_OPCODE_TXF && has_offset)) { > >> - bool is_shadow = tgsi_is_shadow_sampler(target); > >> - const char *name = "llvm.SI.image.sample"; > >> - const char *infix = ""; > >> - > >> - switch (opcode) { > >> - case TGSI_OPCODE_TEX: > >> - case TGSI_OPCODE_TEX2: > >> - case TGSI_OPCODE_TXP: > >> - break; > >> - case TGSI_OPCODE_TXB: > >> - case TGSI_OPCODE_TXB2: > >> - infix = ".b"; > >> - break; > >> - case TGSI_OPCODE_TXL: > >> - case TGSI_OPCODE_TXL2: > >> - infix = ".l"; > >> - break; > >> - case TGSI_OPCODE_TXD: > >> - infix = ".d"; > >> - break; > >> - case TGSI_OPCODE_TG4: > >> - name = "llvm.SI.gather4"; > >> - break; > >> - case TGSI_OPCODE_LODQ: > >> - name = "llvm.SI.getlod"; > >> - is_shadow = false; > >> - has_offset = false; > >> - break; > >> - default: > >> - assert(0); > >> - return; > >> - } > >> - > >> - /* Add the type and suffixes .c, .o if needed. */ > >> - sprintf(intr_name, "%s%s%s%s.v%ui32", name, > >> - is_shadow ? ".c" : "", infix, has_offset ? ".o" : "", > >> - LLVMGetVectorSize(LLVMTypeOf(emit_data->args[0]))); > >> - > >> - emit_data->output[emit_data->chan] = lp_build_intrinsic( > >> - base->gallivm->builder, intr_name, > >> emit_data->dst_type, > >> - emit_data->args, emit_data->arg_count, > >> - LLVMReadNoneAttribute | LLVMNoUnwindAttribute); > >> - } else { > >> - LLVMTypeRef i8, v16i8, v32i8; > >> - const char *name; > >> - > >> - switch (opcode) { > >> - case TGSI_OPCODE_TEX: > >> - case TGSI_OPCODE_TEX2: > >> - case TGSI_OPCODE_TXP: > >> - name = "llvm.SI.sample"; > >> - break; > >> - case TGSI_OPCODE_TXB: > >> - case TGSI_OPCODE_TXB2: > >> - name = "llvm.SI.sampleb"; > >> - break; > >> - case TGSI_OPCODE_TXD: > >> - name = "llvm.SI.sampled"; > >> - break; > >> - case TGSI_OPCODE_TXF: > >> - name = "llvm.SI.imageload"; > >> - break; > >> - case TGSI_OPCODE_TXL: > >> - case TGSI_OPCODE_TXL2: > >> - name = "llvm.SI.samplel"; > >> - break; > >> - default: > >> - assert(0); > >> - return; > >> - } > >> - > >> - i8 = LLVMInt8TypeInContext(base->gallivm->context); > >> - v16i8 = LLVMVectorType(i8, 16); > >> - v32i8 = LLVMVectorType(i8, 32); > >> - > >> - emit_data->args[1] = LLVMBuildBitCast(base->gallivm->builder, > >> - emit_data->args[1], v32i8, > >> ""); > >> - if (opcode != TGSI_OPCODE_TXF) { > >> - emit_data->args[2] = > >> LLVMBuildBitCast(base->gallivm->builder, > >> - emit_data->args[2], v16i8, > >> ""); > >> - } > >> - > >> - sprintf(intr_name, "%s.v%ui32", name, > >> - LLVMGetVectorSize(LLVMTypeOf(emit_data->args[0]))); > >> - > >> - emit_data->output[emit_data->chan] = lp_build_intrinsic( > >> - base->gallivm->builder, intr_name, > >> emit_data->dst_type, > >> - emit_data->args, emit_data->arg_count, > >> - LLVMReadNoneAttribute | LLVMNoUnwindAttribute); > >> - } > >> -} > >> - > >> -static void txq_fetch_args( > >> - struct lp_build_tgsi_context * bld_base, > >> - struct lp_build_emit_data * emit_data) > >> -{ > >> - struct si_shader_context *si_shader_ctx = > >> si_shader_context(bld_base); > >> - const struct tgsi_full_instruction *inst = emit_data->inst; > >> - struct gallivm_state *gallivm = bld_base->base.gallivm; > >> - LLVMBuilderRef builder = gallivm->builder; > >> - unsigned target = inst->Texture.Texture; > >> - LLVMValueRef res_ptr; > >> - > >> - if (inst->Src[1].Register.Indirect) { > >> - const struct tgsi_full_src_register *reg = &inst->Src[1]; > >> - LLVMValueRef ind_index; > >> - > >> - ind_index = get_indirect_index(si_shader_ctx, > >> ®->Indirect, reg->Register.Index); > >> - > >> - res_ptr = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, > >> SI_PARAM_RESOURCE); > >> - res_ptr = build_indexed_load_const(si_shader_ctx, res_ptr, > >> - ind_index); > >> - } else > >> - res_ptr = > >> si_shader_ctx->resources[inst->Src[1].Register.Index]; > >> - > >> - if (target == TGSI_TEXTURE_BUFFER) { > >> - LLVMTypeRef i32 = LLVMInt32TypeInContext(gallivm->context); > >> - LLVMTypeRef v8i32 = LLVMVectorType(i32, 8); > >> - > >> - /* Read the size from the buffer descriptor directly. */ > >> - LLVMValueRef res = LLVMBuildBitCast(builder, res_ptr, v8i32, > >> ""); > >> - LLVMValueRef size = LLVMBuildExtractElement(builder, res, > >> - > >> lp_build_const_int32(gallivm, 6), ""); > >> - > >> - if (si_shader_ctx->screen->b.chip_class >= VI) { > >> - /* On VI, the descriptor contains the size in bytes, > >> - * but TXQ must return the size in elements. > >> - * The stride is always non-zero for resources using > >> TXQ. > >> - */ > >> - LLVMValueRef stride = > >> - LLVMBuildExtractElement(builder, res, > >> - > >> lp_build_const_int32(gallivm, 5), ""); > >> - stride = LLVMBuildLShr(builder, stride, > >> - lp_build_const_int32(gallivm, > >> 16), ""); > >> - stride = LLVMBuildAnd(builder, stride, > >> - lp_build_const_int32(gallivm, > >> 0x3FFF), ""); > >> - > >> - size = LLVMBuildUDiv(builder, size, stride, ""); > >> - } > >> - > >> - emit_data->args[0] = size; > >> + switch (opcode) { > >> + case TGSI_OPCODE_TXF: > >> + name = target == TGSI_TEXTURE_2D_MSAA || > >> + target == TGSI_TEXTURE_2D_ARRAY_MSAA ? > >> + "llvm.SI.image.load" : > >> + "llvm.SI.image.load.mip"; > >> + is_shadow = false; > >> + has_offset = false; > >> + break; > >> + case TGSI_OPCODE_TXQ: > >> + name = "llvm.SI.getresinfo"; > >> + is_shadow = false; > >> + has_offset = false; > >> + break; > >> + case TGSI_OPCODE_LODQ: > >> + name = "llvm.SI.getlod"; > >> + is_shadow = false; > >> + has_offset = false; > >> + break; > >> + case TGSI_OPCODE_TEX: > >> + case TGSI_OPCODE_TEX2: > >> + case TGSI_OPCODE_TXP: > >> + break; > >> + case TGSI_OPCODE_TXB: > >> + case TGSI_OPCODE_TXB2: > >> + infix = ".b"; > >> + break; > >> + case TGSI_OPCODE_TXL: > >> + case TGSI_OPCODE_TXL2: > >> + infix = ".l"; > >> + break; > >> + case TGSI_OPCODE_TXD: > >> + infix = ".d"; > >> + break; > >> + case TGSI_OPCODE_TG4: > >> + name = "llvm.SI.gather4"; > >> + break; > >> + default: > >> + assert(0); > >> return; > >> } > >> > >> - /* Mip level */ > >> - emit_data->args[0] = lp_build_emit_fetch(bld_base, inst, 0, > >> TGSI_CHAN_X); > >> - > >> - /* Resource */ > >> - emit_data->args[1] = res_ptr; > >> - > >> - /* Texture target */ > >> - if (target == TGSI_TEXTURE_CUBE_ARRAY || > >> - target == TGSI_TEXTURE_SHADOWCUBE_ARRAY) > >> - target = TGSI_TEXTURE_2D_ARRAY; > >> - > >> - emit_data->args[2] = lp_build_const_int32(bld_base->base.gallivm, > >> - target); > >> - > >> - emit_data->arg_count = 3; > >> - > >> - emit_data->dst_type = LLVMVectorType( > >> - LLVMInt32TypeInContext(bld_base->base.gallivm->context), > >> - 4); > >> -} > >> - > >> -static void build_txq_intrinsic(const struct lp_build_tgsi_action * > >> action, > >> - struct lp_build_tgsi_context * bld_base, > >> - struct lp_build_emit_data * emit_data) > >> -{ > >> - unsigned target = emit_data->inst->Texture.Texture; > >> + if (LLVMGetTypeKind(LLVMTypeOf(emit_data->args[0])) == > >> LLVMVectorTypeKind) > >> + sprintf(type, ".v%ui32", > >> + LLVMGetVectorSize(LLVMTypeOf(emit_data->args[0]))); > >> + else > >> + strcpy(type, ".i32"); > >> > >> - if (target == TGSI_TEXTURE_BUFFER) { > >> - /* Just return the buffer size. */ > >> - emit_data->output[emit_data->chan] = emit_data->args[0]; > >> - return; > >> - } > >> + /* Add the type and suffixes .c, .o if needed. */ > >> + sprintf(intr_name, "%s%s%s%s%s", > >> + name, is_shadow ? ".c" : "", infix, > >> + has_offset ? ".o" : "", type); > >> > >> - build_tgsi_intrinsic_nomem(action, bld_base, emit_data); > >> + emit_data->output[emit_data->chan] = lp_build_intrinsic( > >> + base->gallivm->builder, intr_name, emit_data->dst_type, > >> + emit_data->args, emit_data->arg_count, > >> + LLVMReadNoneAttribute | LLVMNoUnwindAttribute); > >> > >> /* Divide the number of layers by 6 to get the number of cubes. */ > >> - if (target == TGSI_TEXTURE_CUBE_ARRAY || > >> - target == TGSI_TEXTURE_SHADOWCUBE_ARRAY) { > >> + if (opcode == TGSI_OPCODE_TXQ && > >> + (target == TGSI_TEXTURE_CUBE_ARRAY || > >> + target == TGSI_TEXTURE_SHADOWCUBE_ARRAY)) { > >> LLVMBuilderRef builder = bld_base->base.gallivm->builder; > >> LLVMValueRef two = > >> lp_build_const_int32(bld_base->base.gallivm, 2); > >> LLVMValueRef six = > >> lp_build_const_int32(bld_base->base.gallivm, 6); > >> @@ -3355,12 +3275,6 @@ static const struct lp_build_tgsi_action tex_action > >> = { > >> .emit = build_tex_intrinsic, > >> }; > >> > >> -static const struct lp_build_tgsi_action txq_action = { > >> - .fetch_args = txq_fetch_args, > >> - .emit = build_txq_intrinsic, > >> - .intr_name = "llvm.SI.resinfo" > >> -}; > >> - > >> static const struct lp_build_tgsi_action interp_action = { > >> .fetch_args = interp_fetch_args, > >> .emit = build_interp_intrinsic, > >> @@ -4070,7 +3984,7 @@ int si_shader_create(struct si_screen *sscreen, > >> LLVMTargetMachineRef tm, > >> bld_base->op_actions[TGSI_OPCODE_TXL] = tex_action; > >> bld_base->op_actions[TGSI_OPCODE_TXL2] = tex_action; > >> bld_base->op_actions[TGSI_OPCODE_TXP] = tex_action; > >> - bld_base->op_actions[TGSI_OPCODE_TXQ] = txq_action; > >> + bld_base->op_actions[TGSI_OPCODE_TXQ] = tex_action; > >> bld_base->op_actions[TGSI_OPCODE_TG4] = tex_action; > >> bld_base->op_actions[TGSI_OPCODE_LODQ] = tex_action; > >> > >> -- > >> 2.1.4 > >> > >> _______________________________________________ > >> mesa-dev mailing list > >> mesa-dev@lists.freedesktop.org > >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev