diff options
Diffstat (limited to 'src/gallium/auxiliary/gallivm')
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_format.h | 28 | ||||
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_format_aos.c | 32 |
2 files changed, 50 insertions, 10 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format.h b/src/gallium/auxiliary/gallivm/lp_bld_format.h index bb1298ed3f4..13d0de875d7 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_format.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_format.h @@ -42,16 +42,9 @@ struct util_format_description; struct lp_type; -boolean -lp_format_is_rgba8(const struct util_format_description *desc); - - -void -lp_build_format_swizzle_soa(const struct util_format_description *format_desc, - struct lp_type type, - const LLVMValueRef *unswizzled, - LLVMValueRef *swizzled); - +/* + * AoS + */ LLVMValueRef lp_build_unpack_rgba_aos(LLVMBuilderRef builder, @@ -71,6 +64,21 @@ lp_build_pack_rgba_aos(LLVMBuilderRef builder, const struct util_format_description *desc, LLVMValueRef rgba); +LLVMValueRef +lp_build_fetch_rgba_aos(LLVMBuilderRef builder, + const struct util_format_description *format_desc, + LLVMValueRef ptr); + + +/* + * SoA + */ + +void +lp_build_format_swizzle_soa(const struct util_format_description *format_desc, + struct lp_type type, + const LLVMValueRef *unswizzled, + LLVMValueRef *swizzled); void lp_build_unpack_rgba_soa(LLVMBuilderRef builder, diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c index e55ac6faedd..4cf285efb89 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c @@ -378,3 +378,35 @@ lp_build_pack_rgba_aos(LLVMBuilderRef builder, return packed; } + + +/** + * Fetch a pixel into a 4 float AoS. + */ +LLVMValueRef +lp_build_fetch_rgba_aos(LLVMBuilderRef builder, + const struct util_format_description *format_desc, + LLVMValueRef ptr) +{ + if (format_desc->layout == UTIL_FORMAT_LAYOUT_PLAIN && + (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB || + format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) && + format_desc->block.width == 1 && + format_desc->block.height == 1 && + format_desc->block.bits <= 32 && + format_desc->channel[0].type != UTIL_FORMAT_TYPE_FLOAT) + { + LLVMValueRef packed; + + ptr = LLVMBuildBitCast(builder, ptr, + LLVMPointerType(LLVMIntType(format_desc->block.bits), 0) , ""); + + packed = LLVMBuildLoad(builder, ptr, "packed"); + + return lp_build_unpack_rgba_aos(builder, format_desc, packed); + } + else { + assert(0); + return LLVMGetUndef(LLVMVectorType(LLVMFloatType(), 4)); + } +} |