Mesa (master): llvmpipe: Support sampling from PIPE_FORMAT_R32_FLOAT.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Thu Apr 1 18:01:50 UTC 2010


Module: Mesa
Branch: master
Commit: 7e1aceaf0a1fb7b4ee44c7bc488f03b584b8b785
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7e1aceaf0a1fb7b4ee44c7bc488f03b584b8b785

Author: José Fonseca <jfonseca at vmware.com>
Date:   Thu Apr  1 19:00:03 2010 +0100

llvmpipe: Support sampling from PIPE_FORMAT_R32_FLOAT.

---

 src/gallium/auxiliary/gallivm/lp_bld_format_soa.c |   46 +++++++++++++++++++-
 src/gallium/drivers/llvmpipe/lp_screen.c          |    3 +-
 2 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
index e5153a4..9f24284 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
@@ -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;
       }
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index 5ad581b..625d409 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -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 &&




More information about the mesa-commit mailing list