gallivm: Add a function to generate lp_type for a format.
authorJames Benton <jbenton@vmware.com>
Wed, 30 May 2012 13:38:52 +0000 (14:38 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 28 Nov 2012 19:14:36 +0000 (19:14 +0000)
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
src/gallium/auxiliary/gallivm/lp_bld_type.h

index b163fbc66d6f330d01ae56e2c0a6d3081a8e796f..609b9d415d6b64a6bf2837d0654709723e41df75 100644 (file)
@@ -58,13 +58,7 @@ lp_build_fetch_rgba_aos_array(struct gallivm_state *gallivm,
    LLVMValueRef ptr, res = NULL;
    struct lp_type src_type;
 
-   memset(&src_type, 0, sizeof src_type);
-   src_type.floating = format_desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT;
-   src_type.fixed    = format_desc->channel[0].type == UTIL_FORMAT_TYPE_FIXED;
-   src_type.sign     = format_desc->channel[0].type != UTIL_FORMAT_TYPE_UNSIGNED;
-   src_type.norm     = format_desc->channel[0].normalized;
-   src_type.width    = format_desc->channel[0].size;
-   src_type.length   = format_desc->nr_channels;
+   lp_type_from_format_desc(&src_type, format_desc);
 
    assert(src_type.length <= dst_type.length);
 
index 75310e05f3e5c74d89d6f351fc526f85195007fb..6ce5501baf4ee742eba22880cf8b93000f989918 100644 (file)
@@ -37,6 +37,7 @@
 #define LP_BLD_TYPE_H
 
 
+#include "util/u_format.h"
 #include "pipe/p_compiler.h"
 #include "gallivm/lp_bld.h"
 
@@ -165,6 +166,35 @@ struct lp_build_context
 };
 
 
+/**
+ * Converts a format description into an lp_type.
+ *
+ * Only works with "array formats".
+ *
+ * e.g. With PIPE_FORMAT_R32G32B32A32_FLOAT returns an lp_type with float[4]
+ */
+static INLINE void
+lp_type_from_format_desc(struct lp_type* type, const struct util_format_description *format_desc)
+{
+   assert(util_format_is_array(format_desc));
+
+   memset(type, 0, sizeof(struct lp_type));
+   type->floating = format_desc->channel[0].type == UTIL_FORMAT_TYPE_FLOAT;
+   type->fixed    = format_desc->channel[0].type == UTIL_FORMAT_TYPE_FIXED;
+   type->sign     = format_desc->channel[0].type != UTIL_FORMAT_TYPE_UNSIGNED;
+   type->norm     = format_desc->channel[0].normalized;
+   type->width    = format_desc->channel[0].size;
+   type->length   = format_desc->nr_channels;
+}
+
+
+static INLINE void
+lp_type_from_format(struct lp_type* type, enum pipe_format format)
+{
+   lp_type_from_format_desc(type, util_format_description(format));
+}
+
+
 static INLINE unsigned
 lp_type_width(struct lp_type type)
 {