In lp_bld_tgsi_aos.c, emit_fetch() the switch statement is replaced by a call to to a function pointer, which has been added as a field of struct lp_build_tgsi_aos_context. --- src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 4 ++ src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c | 40 +++++++++++++++-------- 2 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h index b5b1c6e..9118a68 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h @@ -43,6 +43,7 @@ #include "tgsi/tgsi_scan.h" +struct tgsi_full_src_register; struct tgsi_token; struct tgsi_shader_info; struct lp_build_mask_context; @@ -246,6 +247,9 @@ struct lp_build_tgsi_aos_context struct tgsi_full_instruction *instructions; uint max_instructions; + + LLVMValueRef (*emit_fetch_switch_file_fn)(struct lp_build_tgsi_aos_context *, + const struct tgsi_full_src_register *); }; diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c index b968c22..3677e76 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_aos.c @@ -98,28 +98,16 @@ swizzle_scalar_aos(struct lp_build_tgsi_aos_context *bld, return lp_build_swizzle_scalar_aos(&bld->base, a, chan); } - -/** - * Register fetch. - */ static LLVMValueRef -emit_fetch( +emit_fetch_switch_file( struct lp_build_tgsi_aos_context *bld, - const struct tgsi_full_instruction *inst, - unsigned src_op) + const struct tgsi_full_src_register *reg) { LLVMBuilderRef builder = bld->base.gallivm->builder; struct lp_type type = bld->base.type; - const struct tgsi_full_src_register *reg = &inst->Src[src_op]; LLVMValueRef res; unsigned chan; - assert(!reg->Register.Indirect); - - /* - * Fetch the from the register file. - */ - switch (reg->Register.File) { case TGSI_FILE_CONSTANT: /* @@ -201,6 +189,29 @@ emit_fetch( return bld->base.undef; } + return res; + +} + +/** + * Register fetch. + */ +static LLVMValueRef +emit_fetch( + struct lp_build_tgsi_aos_context *bld, + const struct tgsi_full_instruction *inst, + unsigned src_op) +{ + LLVMValueRef res; + const struct tgsi_full_src_register *reg = &inst->Src[src_op]; + + assert(!reg->Register.Indirect); + + /* + * Fetch the from the register file. + */ + res = bld->emit_fetch_switch_file_fn(bld, reg); + /* * Apply sign modifier. */ @@ -1025,6 +1036,7 @@ lp_build_tgsi_aos(struct gallivm_state *gallivm, bld.consts_ptr = consts_ptr; bld.sampler = sampler; bld.indirect_files = info->indirect_files; + bld.emit_fetch_switch_file_fn = emit_fetch_switch_file; bld.instructions = (struct tgsi_full_instruction *) MALLOC(LP_MAX_INSTRUCTIONS * sizeof(struct tgsi_full_instruction)); bld.max_instructions = LP_MAX_INSTRUCTIONS; -- 1.7.6.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev