From: Dave Airlie <airl...@redhat.com> The infers the type of data required using the opcode, and casts the input to the appropriate type.
So far this only handles non-indirect constant and temporaries. Signed-off-by: Dave Airlie <airl...@redhat.com> --- src/gallium/auxiliary/gallivm/lp_bld_tgsi.c | 4 +- src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 3 +- src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c | 4 ++ src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 47 +++++++++++++++++++++-- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c index 261301c..7b701f1 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c @@ -38,6 +38,7 @@ #include "tgsi/tgsi_parse.h" #include "tgsi/tgsi_util.h" #include "util/u_memory.h" +#include "util/u_format.h" /* The user is responsible for freeing list->instructions */ unsigned lp_bld_tgsi_list_init(struct lp_build_tgsi_context * bld_base) @@ -298,6 +299,7 @@ lp_build_emit_fetch( const struct tgsi_full_src_register *reg = &inst->Src[src_op]; unsigned swizzle; LLVMValueRef res; + enum util_format_type stype = tgsi_opcode_infer_src_type(inst->Instruction.Opcode); if (chan_index == LP_CHAN_ALL) { swizzle = ~0; @@ -312,7 +314,7 @@ lp_build_emit_fetch( assert(reg->Register.Index <= bld_base->info->file_max[reg->Register.File]); if (bld_base->emit_fetch_funcs[reg->Register.File]) { - res = bld_base->emit_fetch_funcs[reg->Register.File](bld_base, reg, + res = bld_base->emit_fetch_funcs[reg->Register.File](bld_base, reg, stype, swizzle); } else { assert(0 && "invalid src register in emit_fetch()"); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h index a320d94..c620910 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h @@ -273,7 +273,8 @@ struct lp_build_tgsi_context; typedef LLVMValueRef (*lp_build_emit_fetch_fn)(struct lp_build_tgsi_context *, const struct tgsi_full_src_register *, - unsigned); + const unsigned, + const unsigned); struct lp_build_tgsi_context { diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c index 0f98fa8..5e929b3 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c @@ -101,6 +101,7 @@ static LLVMValueRef emit_fetch_constant( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base); @@ -171,6 +172,7 @@ static LLVMValueRef emit_fetch_immediate( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base); @@ -183,6 +185,7 @@ static LLVMValueRef emit_fetch_input( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base); @@ -196,6 +199,7 @@ static LLVMValueRef emit_fetch_temporary( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index 45b0980..17c5d83 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -519,10 +519,31 @@ get_indirect_index(struct lp_build_tgsi_soa_context *bld, return index; } +static struct lp_build_context * +stype_to_fetch(struct lp_build_tgsi_context * bld_base, const unsigned stype) +{ + struct lp_build_context *bld_fetch; + + switch (stype) { + case UTIL_FORMAT_TYPE_FLOAT: + case UTIL_FORMAT_TYPE_VOID: + bld_fetch = &bld_base->base; + break; + case UTIL_FORMAT_TYPE_UNSIGNED: + bld_fetch = &bld_base->uintbld; + break; + case UTIL_FORMAT_TYPE_SIGNED: + bld_fetch = &bld_base->intbld; + break; + } + return bld_fetch; +} + static LLVMValueRef emit_fetch_constant( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); @@ -530,7 +551,8 @@ emit_fetch_constant( LLVMBuilderRef builder = gallivm->builder; struct lp_build_context *uint_bld = &bld->uint_bld; LLVMValueRef indirect_index = NULL; - + struct lp_build_context *fetch_bld = stype_to_fetch(bld_base, stype); + /* XXX: Handle fetching xyzw components as a vector */ assert(swizzle != ~0); @@ -561,9 +583,16 @@ emit_fetch_constant( scalar_ptr = LLVMBuildGEP(builder, bld->consts_ptr, &index, 1, ""); - scalar = LLVMBuildLoad(builder, scalar_ptr, ""); - return lp_build_broadcast_scalar(&bld->bld_base.base, scalar); + if (stype != UTIL_FORMAT_TYPE_FLOAT && stype != UTIL_FORMAT_TYPE_VOID) { + LLVMTypeRef ivtype = LLVMPointerType(LLVMInt32TypeInContext(gallivm->context), 0); + LLVMValueRef temp_ptr; + temp_ptr = LLVMBuildBitCast(builder, scalar_ptr, ivtype, ""); + scalar = LLVMBuildLoad(builder, temp_ptr, ""); + } else + scalar = LLVMBuildLoad(builder, scalar_ptr, ""); + + return lp_build_broadcast_scalar(fetch_bld, scalar); } } @@ -571,6 +600,7 @@ static LLVMValueRef emit_fetch_immediate( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); @@ -583,6 +613,7 @@ static LLVMValueRef emit_fetch_input( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); @@ -640,6 +671,7 @@ static LLVMValueRef emit_fetch_temporary( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); @@ -681,7 +713,13 @@ emit_fetch_temporary( } else { LLVMValueRef temp_ptr; - temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle); + if (stype != UTIL_FORMAT_TYPE_FLOAT && stype != UTIL_FORMAT_TYPE_VOID) { + LLVMTypeRef itype = LLVMPointerType(LLVMVectorType(LLVMInt32TypeInContext(gallivm->context), 4), 0); + LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, + swizzle); + temp_ptr = LLVMBuildBitCast(builder, tint_ptr, itype, ""); + } else + temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle); res = LLVMBuildLoad(builder, temp_ptr, ""); if (!res) return bld->bld_base.base.undef; @@ -694,6 +732,7 @@ static LLVMValueRef emit_fetch_system_value( struct lp_build_tgsi_context * bld_base, const struct tgsi_full_src_register * reg, + const unsigned stype, const unsigned swizzle) { struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); -- 1.7.7.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev