Sadly, this patch requires LLVM 3.5, which I didn't realize. Would it be okay to remove LLVM 3.4.2 support?
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