gallivm: fetch immediates to correct type (v2)
authorDave Airlie <airlied@redhat.com>
Mon, 6 Feb 2012 18:48:17 +0000 (18:48 +0000)
committerDave Airlie <airlied@redhat.com>
Fri, 17 Feb 2012 17:39:02 +0000 (17:39 +0000)
Fetch float/uint/int immediates.

v2: bitcast to uint/int to floats as per Jose's suggestions.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c

index 0ae77900ee46561fc9d41cd1c067c24d0b002154..9a12db7842df0b2a076073173dc7ee63a59274a7 100644 (file)
@@ -1409,11 +1409,30 @@ void lp_emit_immediate_soa(
    const uint size = imm->Immediate.NrTokens - 1;
    assert(size <= 4);
    assert(bld->num_immediates < LP_MAX_TGSI_IMMEDIATES);
+   switch (imm->Immediate.DataType) {
+   case TGSI_IMM_FLOAT32:
+      for( i = 0; i < size; ++i )
+         bld->immediates[bld->num_immediates][i] =
+            lp_build_const_vec(gallivm, bld_base->base.type, imm->u[i].Float);
 
-   for( i = 0; i < size; ++i )
-      bld->immediates[bld->num_immediates][i] =
-              lp_build_const_vec(gallivm, bld_base->base.type, imm->u[i].Float);
+      break;
+   case TGSI_IMM_UINT32:
+      for( i = 0; i < size; ++i ) {
+         LLVMValueRef tmp = lp_build_const_vec(gallivm, bld_base->uint_bld.type, imm->u[i].Uint);
+         bld->immediates[bld->num_immediates][i] =
+            LLVMConstBitCast(tmp, bld_base->base.vec_type);
+      }
 
+      break;
+   case TGSI_IMM_INT32:
+      for( i = 0; i < size; ++i ) {
+         LLVMValueRef tmp = lp_build_const_vec(gallivm, bld_base->int_bld.type, imm->u[i].Int);
+         bld->immediates[bld->num_immediates][i] =
+            LLVMConstBitCast(tmp, bld_base->base.vec_type);
+      }
+            
+      break;
+   }
    for( i = size; i < 4; ++i )
       bld->immediates[bld->num_immediates][i] = bld_base->base.undef;