13cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/************************************************************************** 23cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * 33cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Copyright 2010 VMware, Inc. 43cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * All Rights Reserved. 53cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * 63cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 73cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * copy of this software and associated documentation files (the 83cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * "Software"), to deal in the Software without restriction, including 93cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish, 103cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to 113cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to 123cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * the following conditions: 133cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * 143cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 153cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 163cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 173cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 183cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 193cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 203cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * USE OR OTHER DEALINGS IN THE SOFTWARE. 213cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * 223cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * The above copyright notice and this permission notice (including the 233cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * next paragraph) shall be included in all copies or substantial portions 243cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * of the Software. 253cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * 263cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca **************************************************************************/ 273cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 283cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 293cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 303cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @file 313cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * YUV pixel format manipulation. 323cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * 333cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 343cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 353cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 363cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 373cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca#include "util/u_format.h" 38049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger#include "util/u_cpu_detect.h" 393cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 403cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca#include "lp_bld_arit.h" 413cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca#include "lp_bld_type.h" 423cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca#include "lp_bld_const.h" 433cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca#include "lp_bld_conv.h" 44bb1546f55be3b243b71d39e5fb7457c5b21e32c9José Fonseca#include "lp_bld_gather.h" 453cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca#include "lp_bld_format.h" 46efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#include "lp_bld_init.h" 47049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger#include "lp_bld_logic.h" 483cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 493cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 503cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Extract Y, U, V channels from packed UYVY. 513cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @param packed is a <n x i32> vector with the packed UYVY blocks 523cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @param i is a <n x i32> vector with the x pixel coordinate (0 or 1) 533cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 543cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic void 55efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Pauluyvy_to_yuv_soa(struct gallivm_state *gallivm, 563cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 573cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef packed, 583cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef i, 593cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef *y, 603cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef *u, 613cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef *v) 623cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 63efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBuilderRef builder = gallivm->builder; 643cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca struct lp_type type; 65049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger LLVMValueRef mask; 663cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 673cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca memset(&type, 0, sizeof type); 683cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.width = 32; 693cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.length = n; 703cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 713cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, packed)); 723cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, i)); 733cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 743cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 75049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * y = (uyvy >> (16*i + 8)) & 0xff 763cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * u = (uyvy ) & 0xff 773cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * v = (uyvy >> 16 ) & 0xff 783cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 793cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 80049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) 81049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger /* 82049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * Avoid shift with per-element count. 83049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * No support on x86, gets translated to roughly 5 instructions 84049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * per element. Didn't measure performance but cuts shader size 85049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * by quite a bit (less difference if cpu has no sse4.1 support). 86049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger */ 873469715a8a171512cf9b528702e70393f01c6041José Fonseca if (util_cpu_caps.has_sse2 && n > 1) { 88049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger LLVMValueRef sel, tmp, tmp2; 89049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger struct lp_build_context bld32; 90049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger 91efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_context_init(&bld32, gallivm, type); 92049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger 93efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul tmp = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 8), ""); 94efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul tmp2 = LLVMBuildLShr(builder, tmp, lp_build_const_int_vec(gallivm, type, 16), ""); 95efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul sel = lp_build_compare(gallivm, type, PIPE_FUNC_EQUAL, i, lp_build_const_int_vec(gallivm, type, 0)); 96049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger *y = lp_build_select(&bld32, sel, tmp, tmp2); 97049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger } else 98049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger#endif 99049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger { 100049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger LLVMValueRef shift; 101efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul shift = LLVMBuildMul(builder, i, lp_build_const_int_vec(gallivm, type, 16), ""); 102efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul shift = LLVMBuildAdd(builder, shift, lp_build_const_int_vec(gallivm, type, 8), ""); 103049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger *y = LLVMBuildLShr(builder, packed, shift, ""); 104049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger } 105049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger 1063cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *u = packed; 107efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul *v = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 16), ""); 1083cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 109efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul mask = lp_build_const_int_vec(gallivm, type, 0xff); 1103cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1113cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *y = LLVMBuildAnd(builder, *y, mask, "y"); 1123cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *u = LLVMBuildAnd(builder, *u, mask, "u"); 1133cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *v = LLVMBuildAnd(builder, *v, mask, "v"); 1143cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 1153cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1163cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1173cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 1183cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Extract Y, U, V channels from packed YUYV. 1193cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @param packed is a <n x i32> vector with the packed YUYV blocks 1203cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @param i is a <n x i32> vector with the x pixel coordinate (0 or 1) 1213cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 1223cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic void 123efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulyuyv_to_yuv_soa(struct gallivm_state *gallivm, 1243cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 1253cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef packed, 1263cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef i, 1273cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef *y, 1283cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef *u, 1293cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef *v) 1303cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 131efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBuilderRef builder = gallivm->builder; 1323cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca struct lp_type type; 133049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger LLVMValueRef mask; 1343cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1353cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca memset(&type, 0, sizeof type); 1363cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.width = 32; 1373cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.length = n; 1383cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1393cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, packed)); 1403cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, i)); 1413cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1423cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 1433cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * y = (yuyv >> 16*i) & 0xff 1443cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * u = (yuyv >> 8 ) & 0xff 1453cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * v = (yuyv >> 24 ) & 0xff 1463cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 1473cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 148049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) 149049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger /* 150049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * Avoid shift with per-element count. 151049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * No support on x86, gets translated to roughly 5 instructions 152049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * per element. Didn't measure performance but cuts shader size 153049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger * by quite a bit (less difference if cpu has no sse4.1 support). 154049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger */ 1553469715a8a171512cf9b528702e70393f01c6041José Fonseca if (util_cpu_caps.has_sse2 && n > 1) { 156049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger LLVMValueRef sel, tmp; 157049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger struct lp_build_context bld32; 158049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger 159efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_context_init(&bld32, gallivm, type); 160049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger 161efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul tmp = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 16), ""); 162efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul sel = lp_build_compare(gallivm, type, PIPE_FUNC_EQUAL, i, lp_build_const_int_vec(gallivm, type, 0)); 163049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger *y = lp_build_select(&bld32, sel, packed, tmp); 164049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger } else 165049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger#endif 166049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger { 167049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger LLVMValueRef shift; 168efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul shift = LLVMBuildMul(builder, i, lp_build_const_int_vec(gallivm, type, 16), ""); 169049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger *y = LLVMBuildLShr(builder, packed, shift, ""); 170049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger } 171049a8cce76b1148ab00de1ae207171e519bfafcaRoland Scheidegger 172efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul *u = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 8), ""); 173efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul *v = LLVMBuildLShr(builder, packed, lp_build_const_int_vec(gallivm, type, 24), ""); 1743cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 175efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul mask = lp_build_const_int_vec(gallivm, type, 0xff); 1763cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1773cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *y = LLVMBuildAnd(builder, *y, mask, "y"); 1783cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *u = LLVMBuildAnd(builder, *u, mask, "u"); 1793cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *v = LLVMBuildAnd(builder, *v, mask, "v"); 1803cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 1813cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1823cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1833cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic INLINE void 184efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulyuv_to_rgb_soa(struct gallivm_state *gallivm, 1853cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 1863cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef y, LLVMValueRef u, LLVMValueRef v, 1873cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef *r, LLVMValueRef *g, LLVMValueRef *b) 1883cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 189efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBuilderRef builder = gallivm->builder; 1903cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca struct lp_type type; 1913cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca struct lp_build_context bld; 1923cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1933cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef c0; 1943cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef c8; 1953cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef c16; 1963cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef c128; 1973cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef c255; 1983cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 1993cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef cy; 2003cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef cug; 2013cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef cub; 2023cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef cvr; 2033cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef cvg; 2043cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2053cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca memset(&type, 0, sizeof type); 2063cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.sign = TRUE; 2073cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.width = 32; 2083cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.length = n; 2093cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 210efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_context_init(&bld, gallivm, type); 2113cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2123cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, y)); 2133cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, u)); 2143cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, v)); 2153cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2163cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 2173cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Constants 2183cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 2193cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 220efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul c0 = lp_build_const_int_vec(gallivm, type, 0); 221efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul c8 = lp_build_const_int_vec(gallivm, type, 8); 222efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul c16 = lp_build_const_int_vec(gallivm, type, 16); 223efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul c128 = lp_build_const_int_vec(gallivm, type, 128); 224efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul c255 = lp_build_const_int_vec(gallivm, type, 255); 2253cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 226efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul cy = lp_build_const_int_vec(gallivm, type, 298); 227efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul cug = lp_build_const_int_vec(gallivm, type, -100); 228efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul cub = lp_build_const_int_vec(gallivm, type, 516); 229efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul cvr = lp_build_const_int_vec(gallivm, type, 409); 230efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul cvg = lp_build_const_int_vec(gallivm, type, -208); 2313cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2323cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 2333cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * y -= 16; 2343cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * u -= 128; 2353cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * v -= 128; 2363cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 2373cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2383cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca y = LLVMBuildSub(builder, y, c16, ""); 2393cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca u = LLVMBuildSub(builder, u, c128, ""); 2403cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca v = LLVMBuildSub(builder, v, c128, ""); 2413cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2423cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 2433cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * r = 298 * _y + 409 * _v + 128; 2443cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * g = 298 * _y - 100 * _u - 208 * _v + 128; 2453cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * b = 298 * _y + 516 * _u + 128; 2463cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 2473cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2483cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca y = LLVMBuildMul(builder, y, cy, ""); 2493cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca y = LLVMBuildAdd(builder, y, c128, ""); 2503cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2513cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *r = LLVMBuildMul(builder, v, cvr, ""); 2523cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *g = LLVMBuildAdd(builder, 2533cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMBuildMul(builder, u, cug, ""), 2543cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMBuildMul(builder, v, cvg, ""), 2553cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca ""); 2563cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *b = LLVMBuildMul(builder, u, cub, ""); 2573cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2583cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *r = LLVMBuildAdd(builder, *r, y, ""); 2593cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *g = LLVMBuildAdd(builder, *g, y, ""); 2603cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *b = LLVMBuildAdd(builder, *b, y, ""); 2613cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2623cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 2633cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * r >>= 8; 2643cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * g >>= 8; 2653cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * b >>= 8; 2663cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 2673cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2683cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *r = LLVMBuildAShr(builder, *r, c8, "r"); 2693cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *g = LLVMBuildAShr(builder, *g, c8, "g"); 2703cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *b = LLVMBuildAShr(builder, *b, c8, "b"); 2713cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2723cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 2733cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Clamp 2743cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 2753cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2763cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *r = lp_build_clamp(&bld, *r, c0, c255); 2773cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *g = lp_build_clamp(&bld, *g, c0, c255); 2783cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca *b = lp_build_clamp(&bld, *b, c0, c255); 2793cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 2803cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2813cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2823cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic LLVMValueRef 283efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulrgb_to_rgba_aos(struct gallivm_state *gallivm, 2843cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 2853cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef r, LLVMValueRef g, LLVMValueRef b) 2863cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 287efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBuilderRef builder = gallivm->builder; 2883cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca struct lp_type type; 2893cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef a; 2903cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef rgba; 2913cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2923cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca memset(&type, 0, sizeof type); 2933cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.sign = TRUE; 2943cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.width = 32; 2953cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca type.length = n; 2963cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 2973cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, r)); 2983cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, g)); 2993cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(lp_check_value(type, b)); 3003cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3013cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca /* 3023cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Make a 4 x unorm8 vector 3033cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 3043cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3053cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca r = r; 306efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul g = LLVMBuildShl(builder, g, lp_build_const_int_vec(gallivm, type, 8), ""); 307efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul b = LLVMBuildShl(builder, b, lp_build_const_int_vec(gallivm, type, 16), ""); 308efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul a = lp_build_const_int_vec(gallivm, type, 0xff000000); 3093cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3103cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca rgba = r; 3113cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca rgba = LLVMBuildOr(builder, rgba, g, ""); 3123cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca rgba = LLVMBuildOr(builder, rgba, b, ""); 3133cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca rgba = LLVMBuildOr(builder, rgba, a, ""); 3143cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3153cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca rgba = LLVMBuildBitCast(builder, rgba, 316efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMVectorType(LLVMInt8TypeInContext(gallivm->context), 4*n), ""); 3173cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3183cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca return rgba; 3193cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 3203cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3213cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3223cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 3233cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Convert from <n x i32> packed UYVY to <4n x i8> RGBA AoS 3243cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 3253cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic LLVMValueRef 326efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Pauluyvy_to_rgba_aos(struct gallivm_state *gallivm, 3273cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 3283cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef packed, 3293cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef i) 3303cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 3313cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef y, u, v; 3323cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef r, g, b; 3333cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef rgba; 3343cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 335efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul uyvy_to_yuv_soa(gallivm, n, packed, i, &y, &u, &v); 336efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul yuv_to_rgb_soa(gallivm, n, y, u, v, &r, &g, &b); 337efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = rgb_to_rgba_aos(gallivm, n, r, g, b); 3383cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3393cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca return rgba; 3403cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 3413cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3423cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3433cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 3443cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Convert from <n x i32> packed YUYV to <4n x i8> RGBA AoS 3453cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 3463cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic LLVMValueRef 347efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulyuyv_to_rgba_aos(struct gallivm_state *gallivm, 3483cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 3493cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef packed, 3503cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef i) 3513cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 3523cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef y, u, v; 3533cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef r, g, b; 3543cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef rgba; 3553cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 356efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul yuyv_to_yuv_soa(gallivm, n, packed, i, &y, &u, &v); 357efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul yuv_to_rgb_soa(gallivm, n, y, u, v, &r, &g, &b); 358efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = rgb_to_rgba_aos(gallivm, n, r, g, b); 3593cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3603cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca return rgba; 3613cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 3623cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3633cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3643cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 3653cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Convert from <n x i32> packed RG_BG to <4n x i8> RGBA AoS 3663cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 3673cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic LLVMValueRef 368efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulrgbg_to_rgba_aos(struct gallivm_state *gallivm, 3693cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 3703cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef packed, 3713cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef i) 3723cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 3733cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef r, g, b; 3743cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef rgba; 3753cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 376efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul uyvy_to_yuv_soa(gallivm, n, packed, i, &g, &r, &b); 377efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = rgb_to_rgba_aos(gallivm, n, r, g, b); 3783cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3793cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca return rgba; 3803cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 3813cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3823cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3833cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 3843cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * Convert from <n x i32> packed GR_GB to <4n x i8> RGBA AoS 3853cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 3863cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonsecastatic LLVMValueRef 387efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulgrgb_to_rgba_aos(struct gallivm_state *gallivm, 3883cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca unsigned n, 3893cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef packed, 3903cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef i) 3913cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 3923cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef r, g, b; 3933cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef rgba; 3943cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 395efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul yuyv_to_yuv_soa(gallivm, n, packed, i, &g, &r, &b); 396efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = rgb_to_rgba_aos(gallivm, n, r, g, b); 3973cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 3983cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca return rgba; 3993cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 4003cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 401461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König/** 402461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König * Convert from <n x i32> packed GR_BR to <4n x i8> RGBA AoS 403461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König */ 404461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian Königstatic LLVMValueRef 405461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian Königgrbr_to_rgba_aos(struct gallivm_state *gallivm, 406461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König unsigned n, 407461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef packed, 408461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef i) 409461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König{ 410461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef r, g, b; 411461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef rgba; 412461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König 413461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König uyvy_to_yuv_soa(gallivm, n, packed, i, &r, &g, &b); 414461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König rgba = rgb_to_rgba_aos(gallivm, n, r, g, b); 415461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König 416461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König return rgba; 417461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König} 418461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König 419461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König 420461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König/** 421461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König * Convert from <n x i32> packed RG_RB to <4n x i8> RGBA AoS 422461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König */ 423461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian Königstatic LLVMValueRef 424461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian Königrgrb_to_rgba_aos(struct gallivm_state *gallivm, 425461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König unsigned n, 426461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef packed, 427461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef i) 428461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König{ 429461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef r, g, b; 430461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König LLVMValueRef rgba; 431461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König 432461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König yuyv_to_yuv_soa(gallivm, n, packed, i, &r, &g, &b); 433461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König rgba = rgb_to_rgba_aos(gallivm, n, r, g, b); 434461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König 435461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König return rgba; 436461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König} 4373cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 4383cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca/** 4393cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @param n is the number of pixels processed 4403cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @param packed is a <n x i32> vector with the packed YUYV blocks 4413cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @param i is a <n x i32> vector with the x pixel coordinate (0 or 1) 4423cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca * @return a <4*n x i8> vector with the pixel RGBA values in AoS 4433cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca */ 4443cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé FonsecaLLVMValueRef 445efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_fetch_subsampled_rgba_aos(struct gallivm_state *gallivm, 4467071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca const struct util_format_description *format_desc, 4477071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca unsigned n, 4487071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca LLVMValueRef base_ptr, 4497071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca LLVMValueRef offset, 4507071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca LLVMValueRef i, 4517071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca LLVMValueRef j) 4523cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca{ 4537071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca LLVMValueRef packed; 4543cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca LLVMValueRef rgba; 4553cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 4563cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(format_desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED); 4577071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca assert(format_desc->block.bits == 32); 4587071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca assert(format_desc->block.width == 2); 4597071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca assert(format_desc->block.height == 1); 4607071eefdb2ef2a1f644a2bbed9685847b60ff6c4José Fonseca 461efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul packed = lp_build_gather(gallivm, n, 32, 32, base_ptr, offset); 4623cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 4633cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca (void)j; 4643cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 4653cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca switch (format_desc->format) { 4663cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca case PIPE_FORMAT_UYVY: 467efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = uyvy_to_rgba_aos(gallivm, n, packed, i); 4683cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca break; 4693cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca case PIPE_FORMAT_YUYV: 470efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = yuyv_to_rgba_aos(gallivm, n, packed, i); 4713cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca break; 4723cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca case PIPE_FORMAT_R8G8_B8G8_UNORM: 473efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = rgbg_to_rgba_aos(gallivm, n, packed, i); 4743cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca break; 4753cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca case PIPE_FORMAT_G8R8_G8B8_UNORM: 476efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = grgb_to_rgba_aos(gallivm, n, packed, i); 4773cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca break; 478461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König case PIPE_FORMAT_G8R8_B8R8_UNORM: 479461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König rgba = grbr_to_rgba_aos(gallivm, n, packed, i); 480461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König break; 481461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König case PIPE_FORMAT_R8G8_R8B8_UNORM: 482461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König rgba = rgrb_to_rgba_aos(gallivm, n, packed, i); 483461c34c0cb0e23f11fd9390a37a62d9930a1c48eChristian König break; 4843cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca default: 4853cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca assert(0); 486efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul rgba = LLVMGetUndef(LLVMVectorType(LLVMInt8TypeInContext(gallivm->context), 4*n)); 4873cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca break; 4883cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca } 4893cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 4903cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca return rgba; 4913cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca} 4923cc4301c146e2a6e680939456ea3df4ec2d12e3eJosé Fonseca 493