diff options
| author | José Fonseca <jfonseca@vmware.com> | 2009-10-25 09:03:18 +0000 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2009-10-25 09:53:48 +0000 | 
| commit | b544ab72994a7eda1e8c17fa217213ff3713dd99 (patch) | |
| tree | 183e0034bfb87bf912894f9165327eca71bcaf26 | |
| parent | a55b305c5b3be3fed8112d44878e712cf09303ce (diff) | |
llvmpipe: Add inlines to quickly generate types matching the native SIMD register bitwidth.
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_bld_type.h | 94 | ||||
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_test_blend.c | 20 | 
2 files changed, 102 insertions, 12 deletions
| diff --git a/src/gallium/drivers/llvmpipe/lp_bld_type.h b/src/gallium/drivers/llvmpipe/lp_bld_type.h index 46c298fa20..2fb233d335 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_type.h +++ b/src/gallium/drivers/llvmpipe/lp_bld_type.h @@ -43,13 +43,18 @@  /** + * Native SIMD register width. + * + * 128 for all architectures we care about. + */ +#define LP_NATIVE_VECTOR_WIDTH 128 + +/**   * Several functions can only cope with vectors of length up to this value.   * You may need to increase that value if you want to represent bigger vectors.   */  #define LP_MAX_VECTOR_LENGTH 16 -#define LP_MAX_TYPE_WIDTH 64 -  /**   * The LLVM type system can't conveniently express all the things we care about @@ -134,6 +139,91 @@ struct lp_build_context  }; +static INLINE struct lp_type +lp_type_float(unsigned width) +{ +   struct lp_type res_type; + +   memset(&res_type, 0, sizeof res_type); +   res_type.floating = TRUE; +   res_type.sign = TRUE; +   res_type.width = width; +   res_type.length = LP_NATIVE_VECTOR_WIDTH / width; + +   return res_type; +} + + +static INLINE struct lp_type +lp_type_int(unsigned width) +{ +   struct lp_type res_type; + +   memset(&res_type, 0, sizeof res_type); +   res_type.sign = TRUE; +   res_type.width = width; +   res_type.length = LP_NATIVE_VECTOR_WIDTH / width; + +   return res_type; +} + + +static INLINE struct lp_type +lp_type_uint(unsigned width) +{ +   struct lp_type res_type; + +   memset(&res_type, 0, sizeof res_type); +   res_type.width = width; +   res_type.length = LP_NATIVE_VECTOR_WIDTH / width; + +   return res_type; +} + + +static INLINE struct lp_type +lp_type_unorm(unsigned width) +{ +   struct lp_type res_type; + +   memset(&res_type, 0, sizeof res_type); +   res_type.norm = TRUE; +   res_type.width = width; +   res_type.length = LP_NATIVE_VECTOR_WIDTH / width; + +   return res_type; +} + + +static INLINE struct lp_type +lp_type_fixed(unsigned width) +{ +   struct lp_type res_type; + +   memset(&res_type, 0, sizeof res_type); +   res_type.sign = TRUE; +   res_type.fixed = TRUE; +   res_type.width = width; +   res_type.length = LP_NATIVE_VECTOR_WIDTH / width; + +   return res_type; +} + + +static INLINE struct lp_type +lp_type_ufixed(unsigned width) +{ +   struct lp_type res_type; + +   memset(&res_type, 0, sizeof res_type); +   res_type.fixed = TRUE; +   res_type.width = width; +   res_type.length = LP_NATIVE_VECTOR_WIDTH / width; + +   return res_type; +} + +  LLVMTypeRef  lp_build_elem_type(struct lp_type type); diff --git a/src/gallium/drivers/llvmpipe/lp_test_blend.c b/src/gallium/drivers/llvmpipe/lp_test_blend.c index e3af81cffb..149fec1d54 100644 --- a/src/gallium/drivers/llvmpipe/lp_test_blend.c +++ b/src/gallium/drivers/llvmpipe/lp_test_blend.c @@ -530,11 +530,11 @@ test_one(unsigned verbose,     success = TRUE;     for(i = 0; i < n && success; ++i) {        if(mode == AoS) { -         uint8_t src[LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t dst[LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t con[LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t res[LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t ref[LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; +         uint8_t src[LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t dst[LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t con[LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t res[LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t ref[LP_NATIVE_VECTOR_WIDTH/8];           int64_t start_counter = 0;           int64_t end_counter = 0; @@ -595,11 +595,11 @@ test_one(unsigned verbose,        if(mode == SoA) {           const unsigned stride = type.length*type.width/8; -         uint8_t src[4*LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t dst[4*LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t con[4*LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t res[4*LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; -         uint8_t ref[4*LP_MAX_VECTOR_LENGTH*LP_MAX_TYPE_WIDTH/8]; +         uint8_t src[4*LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t dst[4*LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t con[4*LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t res[4*LP_NATIVE_VECTOR_WIDTH/8]; +         uint8_t ref[4*LP_NATIVE_VECTOR_WIDTH/8];           int64_t start_counter = 0;           int64_t end_counter = 0;           boolean mismatch; | 
