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