gallivm: New function to fetch a pixel into a 4xfloat AoS vector.

This commit is contained in:
José Fonseca 2010-04-20 13:58:45 +02:00
parent b29fcc7b3a
commit e08d0cc165
2 changed files with 50 additions and 10 deletions

View File

@ -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,

View File

@ -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));
}
}