gallium: a lot more complete implementation of stream output
[mesa.git] / src / gallium / auxiliary / draw / draw_llvm_translate.c
index 6cbe98c48931cf245eaa25bc3d61493cb7b0160b..d7da7ed357d0ef47e7e3f66e07d65b8a4d63983b 100644 (file)
@@ -4,14 +4,12 @@
 #include "draw_llvm.h"
 
 #include "gallivm/lp_bld_arit.h"
-#include "gallivm/lp_bld_interp.h"
 #include "gallivm/lp_bld_struct.h"
-#include "gallivm/lp_bld_type.h"
-#include "gallivm/lp_bld_flow.h"
+#include "gallivm/lp_bld_format.h"
 #include "gallivm/lp_bld_debug.h"
-#include "gallivm/lp_bld_tgsi.h"
 
 #include "util/u_memory.h"
+#include "util/u_format.h"
 #include "pipe/p_state.h"
 
 
@@ -21,7 +19,7 @@ static  LLVMValueRef
 from_64_float(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMDoubleType() , "");
+                                      LLVMPointerType(LLVMDoubleType(), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    return LLVMBuildFPTrunc(builder, l, LLVMFloatType(), "");
 }
@@ -30,7 +28,7 @@ static LLVMValueRef
 from_32_float(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMFloatType() , "");
+                                      LLVMPointerType(LLVMFloatType(), 0) , "");
    return LLVMBuildLoad(builder, bc, "");
 }
 
@@ -45,7 +43,7 @@ static INLINE LLVMValueRef
 from_16_uscaled(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(16) , "");
+                                      LLVMPointerType(LLVMIntType(16), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    return LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
 }
@@ -54,7 +52,7 @@ static INLINE LLVMValueRef
 from_32_uscaled(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(32) , "");
+                                      LLVMPointerType(LLVMIntType(32), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    return LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
 }
@@ -70,7 +68,7 @@ static INLINE LLVMValueRef
 from_16_sscaled(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(16) , "");
+                                      LLVMPointerType(LLVMIntType(16), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    return LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
 }
@@ -79,7 +77,7 @@ static INLINE LLVMValueRef
 from_32_sscaled(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(32) , "");
+                                      LLVMPointerType(LLVMIntType(32), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    return LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
 }
@@ -98,7 +96,7 @@ static INLINE LLVMValueRef
 from_16_unorm(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(16) , "");
+                                      LLVMPointerType(LLVMIntType(16), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    LLVMValueRef uscaled = LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
    return LLVMBuildFDiv(builder, uscaled,
@@ -109,7 +107,7 @@ static INLINE LLVMValueRef
 from_32_unorm(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(32) , "");
+                                      LLVMPointerType(LLVMIntType(32), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    LLVMValueRef uscaled = LLVMBuildUIToFP(builder, l, LLVMFloatType(), "");
 
@@ -130,7 +128,7 @@ static INLINE LLVMValueRef
 from_16_snorm(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(16) , "");
+                                      LLVMPointerType(LLVMIntType(16), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    LLVMValueRef uscaled = LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
    return LLVMBuildFDiv(builder, uscaled,
@@ -141,7 +139,7 @@ static INLINE LLVMValueRef
 from_32_snorm(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(32) , "");
+                                      LLVMPointerType(LLVMIntType(32), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    LLVMValueRef uscaled = LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
 
@@ -153,7 +151,7 @@ static INLINE LLVMValueRef
 from_32_fixed(LLVMBuilderRef builder, LLVMValueRef val)
 {
    LLVMValueRef bc = LLVMBuildBitCast(builder, val,
-                                      LLVMIntType(32) , "");
+                                      LLVMPointerType(LLVMIntType(32), 0) , "");
    LLVMValueRef l = LLVMBuildLoad(builder, bc, "");
    LLVMValueRef uscaled = LLVMBuildSIToFP(builder, l, LLVMFloatType(), "");
 
@@ -412,9 +410,6 @@ struct draw_llvm_translate {
    {PIPE_FORMAT_R32G32_FIXED,       from_32_fixed, to_32_fixed, LL_Int32, 2},
    {PIPE_FORMAT_R32G32B32_FIXED,    from_32_fixed, to_32_fixed, LL_Int32, 3},
    {PIPE_FORMAT_R32G32B32A32_FIXED, from_32_fixed, to_32_fixed, LL_Int32, 4},
-
-   {PIPE_FORMAT_A8R8G8B8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 4},
-   {PIPE_FORMAT_B8G8R8A8_UNORM, from_8_unorm, to_8_unorm, LL_Int8, 4},
 };
 
 
@@ -427,14 +422,20 @@ fetch(LLVMBuilderRef builder,
    int offset = 0;
    LLVMValueRef res = LLVMConstNull(
       LLVMVectorType(LLVMFloatType(), 4));
+   LLVMValueRef defaults[4];
+
+   defaults[0] = LLVMConstReal(LLVMFloatType(), 0);
+   defaults[1] = LLVMConstReal(LLVMFloatType(), 0);
+   defaults[2] = LLVMConstReal(LLVMFloatType(), 0);
+   defaults[3] = LLVMConstReal(LLVMFloatType(), 1);
 
    for (i = 0; i < nr_components; ++i) {
       LLVMValueRef src_index = LLVMConstInt(LLVMInt32Type(), offset, 0);
       LLVMValueRef dst_index = LLVMConstInt(LLVMInt32Type(), i, 0);
-      LLVMValueRef src_tmp = LLVMBuildGEP(builder, ptr, &src_index, 1, "");
+      LLVMValueRef src_tmp;
       LLVMValueRef component;
 
-      src_tmp = LLVMBuildLoad(builder, src_tmp, "");
+      src_tmp = LLVMBuildGEP(builder, ptr, &src_index, 1, "src_tmp");
 
       /* convert src_tmp to float */
       component = func(builder, src_tmp);
@@ -446,6 +447,13 @@ fetch(LLVMBuilderRef builder,
                                    dst_index, "");
       offset += val_size;
    }
+   for (; i < 4; ++i) {
+      LLVMValueRef dst_index = LLVMConstInt(LLVMInt32Type(), i, 0);
+      res = LLVMBuildInsertElement(builder,
+                                   res,
+                                   defaults[i],
+                                   dst_index, "");
+   }
    return res;
 }
 
@@ -455,7 +463,15 @@ draw_llvm_translate_from(LLVMBuilderRef builder,
                          LLVMValueRef vbuffer,
                          enum pipe_format from_format)
 {
+   const struct util_format_description *format_desc;
+   LLVMValueRef zero;
    int i;
+
+   /*
+    * The above can only cope with straight arrays: no bitfields,
+    * swizzles, or half floats.
+    */
+
    for (i = 0; i < Elements(translates); ++i) {
       if (translates[i].format == from_format) {
          /*LLVMTypeRef type = ll_type_to_llvm(translates[i].type);*/
@@ -466,5 +482,16 @@ draw_llvm_translate_from(LLVMBuilderRef builder,
                       translates[i].from);
       }
    }
-   return LLVMGetUndef(LLVMVectorType(LLVMFloatType(), 4));
+
+
+   /*
+    * This doesn't handle anything bigger than 32bits, or half floats
+    * yet.
+    *
+    * TODO: unify all this code into lp_build_fetch_rgba_aos().
+    */
+
+   format_desc = util_format_description(from_format);
+   zero = LLVMConstNull(LLVMInt32Type());
+   return lp_build_fetch_rgba_aos(builder, format_desc, vbuffer, zero, zero);
 }