diff options
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_bld_format.h | 7 | ||||
| -rw-r--r-- | src/gallium/drivers/llvmpipe/lp_bld_format_soa.c | 43 | 
2 files changed, 34 insertions, 16 deletions
| diff --git a/src/gallium/drivers/llvmpipe/lp_bld_format.h b/src/gallium/drivers/llvmpipe/lp_bld_format.h index 42ee3c7d90..8b08c016c0 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_format.h +++ b/src/gallium/drivers/llvmpipe/lp_bld_format.h @@ -42,6 +42,13 @@ struct util_format_description;  struct lp_type; +void +lp_build_format_swizzle_soa(const struct util_format_description *format_desc, +                            struct lp_type type, +                            const LLVMValueRef *unswizzled, +                            LLVMValueRef *swizzled); + +  /**   * Unpack a pixel into its RGBA components.   * diff --git a/src/gallium/drivers/llvmpipe/lp_bld_format_soa.c b/src/gallium/drivers/llvmpipe/lp_bld_format_soa.c index 60ad4c0ee6..64151d169d 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_format_soa.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_format_soa.c @@ -35,16 +35,16 @@  static LLVMValueRef -lp_build_format_swizzle(struct lp_type type, -                        const LLVMValueRef *inputs, -                        enum util_format_swizzle swizzle) +lp_build_format_swizzle_chan_soa(struct lp_type type, +                                 const LLVMValueRef *unswizzled, +                                 enum util_format_swizzle swizzle)  {     switch (swizzle) {     case UTIL_FORMAT_SWIZZLE_X:     case UTIL_FORMAT_SWIZZLE_Y:     case UTIL_FORMAT_SWIZZLE_Z:     case UTIL_FORMAT_SWIZZLE_W: -      return inputs[swizzle]; +      return unswizzled[swizzle];     case UTIL_FORMAT_SWIZZLE_0:        return lp_build_zero(type);     case UTIL_FORMAT_SWIZZLE_1: @@ -59,6 +59,28 @@ lp_build_format_swizzle(struct lp_type type,  void +lp_build_format_swizzle_soa(const struct util_format_description *format_desc, +                            struct lp_type type, +                            const LLVMValueRef *unswizzled, +                            LLVMValueRef *swizzled) +{ +   if(format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) { +      enum util_format_swizzle swizzle = format_desc->swizzle[0]; +      LLVMValueRef depth = lp_build_format_swizzle_chan_soa(type, unswizzled, swizzle); +      swizzled[2] = swizzled[1] = swizzled[0] = depth; +      swizzled[3] = lp_build_one(type); +   } +   else { +      unsigned chan; +      for (chan = 0; chan < 4; ++chan) { +         enum util_format_swizzle swizzle = format_desc->swizzle[chan]; +         swizzled[chan] = lp_build_format_swizzle_chan_soa(type, unswizzled, swizzle); +      } +   } +} + + +void  lp_build_unpack_rgba_soa(LLVMBuilderRef builder,                           const struct util_format_description *format_desc,                           struct lp_type type, @@ -123,16 +145,5 @@ lp_build_unpack_rgba_soa(LLVMBuilderRef builder,        start = stop;     } -   if(format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) { -      enum util_format_swizzle swizzle = format_desc->swizzle[0]; -      LLVMValueRef depth = lp_build_format_swizzle(type, inputs, swizzle); -      rgba[2] = rgba[1] = rgba[0] = depth; -      rgba[3] = lp_build_one(type); -   } -   else { -      for (chan = 0; chan < 4; ++chan) { -         enum util_format_swizzle swizzle = format_desc->swizzle[chan]; -         rgba[chan] = lp_build_format_swizzle(type, inputs, swizzle); -      } -   } +   lp_build_format_swizzle_soa(format_desc, type, inputs, rgba);  } | 
