From 71c6fe76c05aa7fc1300cb13e6507abbea5a1e19 Mon Sep 17 00:00:00 2001 From: James Benton Date: Wed, 30 May 2012 14:38:52 +0100 Subject: [PATCH] gallivm: Add a function to generate lp_type for a format. Reviewed-by: Jose Fonseca --- .../gallivm/lp_bld_format_aos_array.c | 8 +---- src/gallium/auxiliary/gallivm/lp_bld_type.h | 30 +++++++++++++++++++ 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) {