Mesa (master): gallivm: Get the format translation logic write.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Wed Apr 7 21:19:44 UTC 2010


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

Author: José Fonseca <jfonseca at vmware.com>
Date:   Wed Apr  7 22:17:07 2010 +0100

gallivm: Get the format translation logic write.

---

 src/gallium/auxiliary/gallivm/lp_bld_format_soa.c |   24 ++++++++++++++++----
 1 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
index 433134b..459a6bf 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
@@ -113,7 +113,7 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,
    unsigned start;
    unsigned chan;
 
-   /* FIXME: Support more pixel formats */
+   assert(format_desc->layout == UTIL_FORMAT_LAYOUT_PLAIN);
    assert(format_desc->block.width == 1);
    assert(format_desc->block.height == 1);
    assert(format_desc->block.bits <= type.width);
@@ -227,8 +227,17 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,
          break;
 
       case UTIL_FORMAT_TYPE_FIXED:
-         assert(0);
-         input = lp_build_undef(type);
+         if (type.floating) {
+            double scale = 1.0 / ((1 << (format_desc->channel[chan].size/2)) - 1);
+            LLVMValueRef scale_val = lp_build_const_vec(type, scale);
+            input = LLVMBuildSIToFP(builder, input, lp_build_vec_type(type), "");
+            input = LLVMBuildMul(builder, input, scale_val, "");
+         }
+         else {
+            /* FIXME */
+            assert(0);
+            input = lp_build_undef(type);
+         }
          break;
 
       default:
@@ -262,9 +271,14 @@ lp_build_fetch_rgba_soa(LLVMBuilderRef builder,
                         LLVMValueRef *rgba)
 {
 
-   if (format_desc->block.width == 1 &&
+   if (format_desc->layout == UTIL_FORMAT_LAYOUT_PLAIN &&
+       (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
+        format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) &&
+       format_desc->block.width == 1 &&
        format_desc->block.height == 1 &&
-       format_desc->block.bits <= type.width)
+       format_desc->block.bits <= type.width &&
+       (format_desc->channel[0].type != UTIL_FORMAT_TYPE_FLOAT ||
+        format_desc->channel[0].size == 32))
    {
       /*
        * The packed pixel fits into an element of the destination format. Put




More information about the mesa-commit mailing list