draw: Fallback to gallivm for translation of A8R8G8B8/B8G8R8A8/R10G10B10X2/R10G10B10X...
authorJosé Fonseca <jfonseca@vmware.com>
Tue, 20 Apr 2010 12:02:05 +0000 (14:02 +0200)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 20 Apr 2010 12:02:05 +0000 (14:02 +0200)
These need swizzles, and bitshifts.

src/gallium/auxiliary/draw/draw_llvm_translate.c

index d8438b85a52798131707dc1ff7b669ab3a88525f..d1c7fa44e12eca6dc27619c82781cc48991a8c89 100644 (file)
@@ -5,9 +5,11 @@
 
 #include "gallivm/lp_bld_arit.h"
 #include "gallivm/lp_bld_struct.h"
+#include "gallivm/lp_bld_format.h"
 #include "gallivm/lp_bld_debug.h"
 
 #include "util/u_memory.h"
+#include "util/u_format.h"
 #include "pipe/p_state.h"
 
 
@@ -408,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},
 };
 
 
@@ -464,7 +463,14 @@ draw_llvm_translate_from(LLVMBuilderRef builder,
                          LLVMValueRef vbuffer,
                          enum pipe_format from_format)
 {
+   const struct util_format_description *format_desc;
    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);*/
@@ -475,5 +481,15 @@ 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);
+   return lp_build_fetch_rgba_aos(builder, format_desc, vbuffer);
 }