X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fgallivm%2Flp_bld_format_yuv.c;h=121452d75966a2e5229a5ba5ea955bfc554eff38;hb=08ee72100fe22e067564cf71c25131771203dd36;hp=f77eb1212b1462f9543510cfee3ca185c298cbce;hpb=3469715a8a171512cf9b528702e70393f01c6041;p=mesa.git diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_yuv.c b/src/gallium/auxiliary/gallivm/lp_bld_format_yuv.c index f77eb1212b1..121452d7596 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_format_yuv.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_yuv.c @@ -34,7 +34,7 @@ */ -#include "util/u_format.h" +#include "util/format/u_format.h" #include "util/u_cpu_detect.h" #include "lp_bld_arit.h" @@ -72,9 +72,15 @@ uyvy_to_yuv_soa(struct gallivm_state *gallivm, assert(lp_check_value(type, i)); /* + * Little endian: * y = (uyvy >> (16*i + 8)) & 0xff * u = (uyvy ) & 0xff * v = (uyvy >> 16 ) & 0xff + * + * Big endian: + * y = (uyvy >> (-16*i + 16)) & 0xff + * u = (uyvy >> 24) & 0xff + * v = (uyvy >> 8) & 0xff */ #if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) @@ -98,13 +104,23 @@ uyvy_to_yuv_soa(struct gallivm_state *gallivm, #endif { LLVMValueRef shift; +#if UTIL_ARCH_LITTLE_ENDIAN shift = LLVMBuildMul(builder, i, lp_build_const_int_vec(gallivm, type, 16), ""); shift = LLVMBuildAdd(builder, shift, lp_build_const_int_vec(gallivm, type, 8), ""); +#else + shift = LLVMBuildMul(builder, i, lp_build_const_int_vec(gallivm, type, -16), ""); + shift = LLVMBuildAdd(builder, shift, lp_build_const_int_vec(gallivm, type, 16), ""); +#endif *y = LLVMBuildLShr(builder, packed, shift, ""); } +#if UTIL_ARCH_LITTLE_ENDIAN *u = packed; *v = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 16), ""); +#else + *u = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 24), ""); + *v = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 8), ""); +#endif mask = lp_build_const_int_vec(gallivm, type, 0xff); @@ -140,9 +156,15 @@ yuyv_to_yuv_soa(struct gallivm_state *gallivm, assert(lp_check_value(type, i)); /* + * Little endian: * y = (yuyv >> 16*i) & 0xff * u = (yuyv >> 8 ) & 0xff * v = (yuyv >> 24 ) & 0xff + * + * Big endian: + * y = (yuyv >> (-16*i + 24) & 0xff + * u = (yuyv >> 16) & 0xff + * v = (yuyv) & 0xff */ #if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) @@ -165,12 +187,22 @@ yuyv_to_yuv_soa(struct gallivm_state *gallivm, #endif { LLVMValueRef shift; +#if UTIL_ARCH_LITTLE_ENDIAN shift = LLVMBuildMul(builder, i, lp_build_const_int_vec(gallivm, type, 16), ""); +#else + shift = LLVMBuildMul(builder, i, lp_build_const_int_vec(gallivm, type, -16), ""); + shift = LLVMBuildAdd(builder, shift, lp_build_const_int_vec(gallivm, type, 24), ""); +#endif *y = LLVMBuildLShr(builder, packed, shift, ""); } +#if UTIL_ARCH_LITTLE_ENDIAN *u = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 8), ""); *v = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 24), ""); +#else + *u = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 16), ""); + *v = packed; +#endif mask = lp_build_const_int_vec(gallivm, type, 0xff); @@ -180,7 +212,7 @@ yuyv_to_yuv_soa(struct gallivm_state *gallivm, } -static INLINE void +static inline void yuv_to_rgb_soa(struct gallivm_state *gallivm, unsigned n, LLVMValueRef y, LLVMValueRef u, LLVMValueRef v, @@ -302,10 +334,17 @@ rgb_to_rgba_aos(struct gallivm_state *gallivm, * Make a 4 x unorm8 vector */ +#if UTIL_ARCH_LITTLE_ENDIAN r = r; g = LLVMBuildShl(builder, g, lp_build_const_int_vec(gallivm, type, 8), ""); b = LLVMBuildShl(builder, b, lp_build_const_int_vec(gallivm, type, 16), ""); a = lp_build_const_int_vec(gallivm, type, 0xff000000); +#else + r = LLVMBuildShl(builder, r, lp_build_const_int_vec(gallivm, type, 24), ""); + g = LLVMBuildShl(builder, g, lp_build_const_int_vec(gallivm, type, 16), ""); + b = LLVMBuildShl(builder, b, lp_build_const_int_vec(gallivm, type, 8), ""); + a = lp_build_const_int_vec(gallivm, type, 0x000000ff); +#endif rgba = r; rgba = LLVMBuildOr(builder, rgba, g, ""); @@ -452,13 +491,15 @@ lp_build_fetch_subsampled_rgba_aos(struct gallivm_state *gallivm, { LLVMValueRef packed; LLVMValueRef rgba; + struct lp_type fetch_type; assert(format_desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED); assert(format_desc->block.bits == 32); assert(format_desc->block.width == 2); assert(format_desc->block.height == 1); - packed = lp_build_gather(gallivm, n, 32, 32, base_ptr, offset); + fetch_type = lp_type_uint(32); + packed = lp_build_gather(gallivm, n, 32, fetch_type, TRUE, base_ptr, offset, FALSE); (void)j;