summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c8
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_type.h30
2 files changed, 31 insertions, 7 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c b/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
index b163fbc66d6..609b9d415d6 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_format_aos_array.c
@@ -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);
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_type.h b/src/gallium/auxiliary/gallivm/lp_bld_type.h
index 75310e05f3e..6ce5501baf4 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_type.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_type.h
@@ -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)
{