[Mesa-dev] [PATCH 4/4] gallivm/tgsi: handle untyped moves

Zack Rusin zackr at vmware.com
Tue Apr 9 17:22:26 PDT 2013


both mov and ucmp can be used to move variables of any type.
correctly note that about ucmp in the tgsi_info and make
sure gallivm can handle that by correctly casting the untyped
moves.

Signed-off-by: Zack Rusin <zackr at vmware.com>
---
 src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c |    8 ++++++++
 src/gallium/auxiliary/tgsi/tgsi_info.c          |    1 +
 2 files changed, 9 insertions(+)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index 6cc72ff..9501100 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -1084,6 +1084,14 @@ emit_store_chan(
       break;
    }
 
+   /* If we're destination is untyped then the source can be anything,
+    * but LLVM won't like if the types don't match so lets cast
+    * to the correct destination type as expected by LLVM */
+   if (dtype == TGSI_TYPE_UNTYPED &&
+       !lp_check_vec_type(bld_store->type, LLVMTypeOf(value))) {
+      value = LLVMBuildBitCast(builder, value, bld_store->vec_type, "src_casted");
+   }
+
    switch( inst->Instruction.Saturate ) {
    case TGSI_SAT_NONE:
       break;
diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c
index 8ae5523..1fadfec 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_info.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_info.c
@@ -327,6 +327,7 @@ tgsi_opcode_infer_dst_type( uint opcode )
 {
    switch (opcode) {
    case TGSI_OPCODE_MOV:
+   case TGSI_OPCODE_UCMP:
       return TGSI_TYPE_UNTYPED;
    case TGSI_OPCODE_F2U:
    case TGSI_OPCODE_AND:
-- 
1.7.10.4



More information about the mesa-dev mailing list