llvmpipe: Support sampling from PIPE_FORMAT_R32_FLOAT.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 1 Apr 2010 18:00:03 +0000 (19:00 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Thu, 1 Apr 2010 18:01:46 +0000 (19:01 +0100)
src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
src/gallium/drivers/llvmpipe/lp_screen.c

index e5153a4bbbd7dbe21707a0e48548a1e491e9527a..9f242844e5a454c5026b0c5efb0e660bfb4ac6f9 100644 (file)
@@ -80,6 +80,24 @@ lp_build_format_swizzle_soa(const struct util_format_description *format_desc,
 }
 
 
+/**
+ * Unpack several pixels in SoA.
+ *
+ * It takes a vector of packed pixels:
+ *
+ *   packed = {P0, P1, P2, P3, ..., Pn}
+ *
+ * And will produce four vectors:
+ *
+ *   red    = {R0, R1, R2, R3, ..., Rn}
+ *   green  = {G0, G1, G2, G3, ..., Gn}
+ *   blue   = {B0, B1, B2, B3, ..., Bn}
+ *   alpha  = {A0, A1, A2, A3, ..., An}
+ *
+ * It requires that a packed pixel fits into an element of the output
+ * channels. The common case is when converting pixel with a depth of 32 bit or
+ * less into floats.
+ */
 void
 lp_build_unpack_rgba_soa(LLVMBuilderRef builder,
                          const struct util_format_description *format_desc,
@@ -91,11 +109,13 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,
    unsigned start;
    unsigned chan;
 
-   /* FIXME: Support more formats */
-   assert(format_desc->is_bitmask);
+   /* FIXME: Support more pixel formats */
    assert(format_desc->block.width == 1);
    assert(format_desc->block.height == 1);
-   assert(format_desc->block.bits <= 32);
+   assert(format_desc->block.bits <= type.width);
+   /* FIXME: Support more output types */
+   assert(type.floating);
+   assert(type.width == 32);
 
    /* Decode the input vector components */
    start = 0;
@@ -188,7 +208,27 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,
 
          break;
 
+      case UTIL_FORMAT_TYPE_FLOAT:
+         if (type.floating) {
+            assert(start == 0);
+            assert(stop == 32);
+            assert(type.width == 32);
+            input = LLVMBuildBitCast(builder, input, lp_build_vec_type(type), "");
+         }
+         else {
+            /* FIXME */
+            assert(0);
+            input = lp_build_undef(type);
+         }
+         break;
+
+      case UTIL_FORMAT_TYPE_FIXED:
+         assert(0);
+         input = lp_build_undef(type);
+         break;
+
       default:
+         assert(0);
          input = lp_build_undef(type);
          break;
       }
index 5ad581bd179dc7b00ab2a3a791ed025a093d86c6..625d4092db66e9687994f6e23644e61cc05ec529 100644 (file)
@@ -222,7 +222,8 @@ llvmpipe_is_format_supported( struct pipe_screen *_screen,
 
    /* FIXME: Temporary restrictions. See lp_bld_sample_soa.c */
    if(tex_usage & PIPE_TEXTURE_USAGE_SAMPLER) {
-      if(!format_desc->is_bitmask)
+      if(!format_desc->is_bitmask &&
+         format != PIPE_FORMAT_R32_FLOAT)
          return FALSE;
 
       if(format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB &&