X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fgallivm%2Flp_bld_tgsi.c;h=c5d36793b21b7fcc41d8353c9e11d48034fd2cc8;hb=8c822b1e912de9af6bb16a052bf9f188c2f4a33f;hp=680c85f843c8082b66cbd6eb5a34813d2dcc6e90;hpb=95ed0e9b6b445c70e920d340818fc0f84d45233e;p=mesa.git diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c index 680c85f843c..c5d36793b21 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c @@ -3,7 +3,7 @@ * Copyright 2011-2012 Advanced Micro Devices, Inc. * Copyright 2010 VMware, Inc. * Copyright 2009 VMware, Inc. - * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2007-2008 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -54,7 +54,7 @@ unsigned lp_bld_tgsi_list_init(struct lp_build_tgsi_context * bld_base) unsigned lp_bld_tgsi_add_instruction( struct lp_build_tgsi_context * bld_base, - struct tgsi_full_instruction *inst_to_add) + const struct tgsi_full_instruction *inst_to_add) { if (bld_base->num_instructions == bld_base->max_instructions) { @@ -200,18 +200,18 @@ lp_build_tgsi_inst_llvm( bld_base->pc++; + if (bld_base->emit_debug) { + bld_base->emit_debug(bld_base, inst, info); + } + /* Ignore deprecated instructions */ switch (inst->Instruction.Opcode) { - case TGSI_OPCODE_RCC: case TGSI_OPCODE_UP2H: case TGSI_OPCODE_UP2US: case TGSI_OPCODE_UP4B: case TGSI_OPCODE_UP4UB: - case TGSI_OPCODE_X2D: - case TGSI_OPCODE_ARA: case TGSI_OPCODE_BRA: - case TGSI_OPCODE_DIV: case TGSI_OPCODE_PUSHA: case TGSI_OPCODE_POPA: case TGSI_OPCODE_SAD: @@ -311,11 +311,43 @@ lp_build_emit_fetch( } if (reg->Register.Absolute) { - res = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, res); + switch (stype) { + case TGSI_TYPE_FLOAT: + case TGSI_TYPE_DOUBLE: + case TGSI_TYPE_UNTYPED: + /* modifiers on movs assume data is float */ + res = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, res); + break; + case TGSI_TYPE_UNSIGNED: + case TGSI_TYPE_SIGNED: + case TGSI_TYPE_VOID: + default: + /* abs modifier is only legal on floating point types */ + assert(0); + break; + } } if (reg->Register.Negate) { - res = lp_build_negate( &bld_base->base, res ); + switch (stype) { + case TGSI_TYPE_FLOAT: + case TGSI_TYPE_UNTYPED: + /* modifiers on movs assume data is float */ + res = lp_build_negate( &bld_base->base, res ); + break; + case TGSI_TYPE_DOUBLE: + /* no double build context */ + assert(0); + break; + case TGSI_TYPE_SIGNED: + case TGSI_TYPE_UNSIGNED: + res = lp_build_negate( &bld_base->int_bld, res ); + break; + case TGSI_TYPE_VOID: + default: + assert(0); + break; + } } /* @@ -334,6 +366,63 @@ lp_build_emit_fetch( } + +LLVMValueRef +lp_build_emit_fetch_texoffset( + struct lp_build_tgsi_context *bld_base, + const struct tgsi_full_instruction *inst, + unsigned tex_off_op, + const unsigned chan_index) +{ + const struct tgsi_texture_offset *off = &inst->TexOffsets[tex_off_op]; + struct tgsi_full_src_register reg; + unsigned swizzle; + LLVMValueRef res; + enum tgsi_opcode_type stype = TGSI_TYPE_SIGNED; + + /* convert offset "register" to ordinary register so can use normal emit funcs */ + memset(®, 0, sizeof(reg)); + reg.Register.File = off->File; + reg.Register.Index = off->Index; + reg.Register.SwizzleX = off->SwizzleX; + reg.Register.SwizzleY = off->SwizzleY; + reg.Register.SwizzleZ = off->SwizzleZ; + + if (chan_index == LP_CHAN_ALL) { + swizzle = ~0; + } else { + assert(chan_index < TGSI_SWIZZLE_W); + swizzle = tgsi_util_get_src_register_swizzle(®.Register, chan_index); + } + + assert(off->Index <= bld_base->info->file_max[off->File]); + + if (bld_base->emit_fetch_funcs[off->File]) { + res = bld_base->emit_fetch_funcs[off->File](bld_base, ®, stype, + swizzle); + } else { + assert(0 && "invalid src register in emit_fetch_texoffset()"); + return bld_base->base.undef; + } + + /* + * Swizzle the argument + */ + + if (swizzle == ~0) { + res = bld_base->emit_swizzle(bld_base, res, + off->SwizzleX, + off->SwizzleY, + off->SwizzleZ, + /* there's no 4th channel */ + off->SwizzleX); + } + + return res; + +} + + boolean lp_build_tgsi_llvm( struct lp_build_tgsi_context * bld_base, @@ -377,8 +466,8 @@ lp_build_tgsi_llvm( } while (bld_base->pc != -1) { - struct tgsi_full_instruction *instr = bld_base->instructions + - bld_base->pc; + const struct tgsi_full_instruction *instr = + bld_base->instructions + bld_base->pc; const struct tgsi_opcode_info *opcode_info = tgsi_get_opcode_info(instr->Instruction.Opcode); if (!lp_build_tgsi_inst_llvm(bld_base, instr)) {