11dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca/**************************************************************************
21dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca *
31dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * Copyright 2009 VMware, Inc.
41dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * All Rights Reserved.
51dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca *
61dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
71dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * copy of this software and associated documentation files (the
81dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * "Software"), to deal in the Software without restriction, including
91dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
101dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
111dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
121dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * the following conditions:
131dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca *
141dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * The above copyright notice and this permission notice (including the
151dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
161dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * of the Software.
171dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca *
181dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
191dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
201dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
211dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
221dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
231dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
241dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
251dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca *
261dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca **************************************************************************/
271dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
281dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca/**
291dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * @file
305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Helper functions for swizzling/shuffling.
311dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca *
321dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
331dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca */
341dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
351dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
361dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca#ifndef LP_BLD_SWIZZLE_H
371dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca#define LP_BLD_SWIZZLE_H
381dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
391dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
400d71ba46e613230c84165106c1fcc9027dec4cd3Brian Paul#include "gallivm/lp_bld.h"
411dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
421dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
43ce98860012b10cc6cc124fd1ed6fa3a5e28712bbJosé Fonsecastruct lp_type;
441dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonsecastruct lp_build_context;
451dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
461dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
473469715a8a171512cf9b528702e70393f01c6041José Fonseca#define LP_BLD_SWIZZLE_DONTCARE 0xFF
483469715a8a171512cf9b528702e70393f01c6041José Fonseca
493469715a8a171512cf9b528702e70393f01c6041José Fonseca
504393ca7956bd03e07b4d7a019705fc62d4ac7155José FonsecaLLVMValueRef
51efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_broadcast(struct gallivm_state *gallivm,
526f5cd15f80d612e165078dfe2126cf44cf509d91José Fonseca                   LLVMTypeRef vec_type,
536f5cd15f80d612e165078dfe2126cf44cf509d91José Fonseca                   LLVMValueRef scalar);
546f5cd15f80d612e165078dfe2126cf44cf509d91José Fonseca
556f5cd15f80d612e165078dfe2126cf44cf509d91José Fonseca
566f5cd15f80d612e165078dfe2126cf44cf509d91José FonsecaLLVMValueRef
574393ca7956bd03e07b4d7a019705fc62d4ac7155José Fonsecalp_build_broadcast_scalar(struct lp_build_context *bld,
584393ca7956bd03e07b4d7a019705fc62d4ac7155José Fonseca                          LLVMValueRef scalar);
594393ca7956bd03e07b4d7a019705fc62d4ac7155José Fonseca
604393ca7956bd03e07b4d7a019705fc62d4ac7155José Fonseca
613fde8167a5d9c1e845053ae4e6a9cd49628adc71José FonsecaLLVMValueRef
62efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_extract_broadcast(struct gallivm_state *gallivm,
633fde8167a5d9c1e845053ae4e6a9cd49628adc71José Fonseca                           struct lp_type src_type,
643fde8167a5d9c1e845053ae4e6a9cd49628adc71José Fonseca                           struct lp_type dst_type,
653fde8167a5d9c1e845053ae4e6a9cd49628adc71José Fonseca                           LLVMValueRef vector,
663fde8167a5d9c1e845053ae4e6a9cd49628adc71José Fonseca                           LLVMValueRef index);
673fde8167a5d9c1e845053ae4e6a9cd49628adc71José Fonseca
683fde8167a5d9c1e845053ae4e6a9cd49628adc71José Fonseca
691dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca/**
701dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * Broadcast one channel of a vector composed of arrays of XYZW structures into
711dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * all four channel.
721dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca */
731dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé FonsecaLLVMValueRef
7434ea50f6720d6aca970613da560a1f25f5b5772cJosé Fonsecalp_build_swizzle_scalar_aos(struct lp_build_context *bld,
751dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca                       LLVMValueRef a,
761dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca                       unsigned channel);
771dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
781dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
791dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca/**
801dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca * Swizzle a vector consisting of an array of XYZW structs.
811dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca *
82a70ec096aaece3aaadc1a8307e32554f7ad4d082José Fonseca * @param swizzles is the in [0,4[ range.
831dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca */
841dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé FonsecaLLVMValueRef
85a70ec096aaece3aaadc1a8307e32554f7ad4d082José Fonsecalp_build_swizzle_aos(struct lp_build_context *bld,
86a70ec096aaece3aaadc1a8307e32554f7ad4d082José Fonseca                     LLVMValueRef a,
87a70ec096aaece3aaadc1a8307e32554f7ad4d082José Fonseca                     const unsigned char swizzles[4]);
881dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
891dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca
902c2debaea71eb99322c2371f1c581e9748cda91fJosé FonsecaLLVMValueRef
912c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonsecalp_build_swizzle_soa_channel(struct lp_build_context *bld,
922c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca                             const LLVMValueRef *unswizzled,
932c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca                             unsigned swizzle);
942c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca
952c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca
962c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonsecavoid
972c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonsecalp_build_swizzle_soa(struct lp_build_context *bld,
982c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca                     const LLVMValueRef *unswizzled,
992c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca                     const unsigned char swizzles[4],
1002c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca                     LLVMValueRef *swizzled);
1012c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca
1022c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca
1032c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonsecavoid
1042c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonsecalp_build_swizzle_soa_inplace(struct lp_build_context *bld,
1052c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca                             LLVMValueRef *values,
1062c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca                             const unsigned char swizzles[4]);
1072c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca
1082c2debaea71eb99322c2371f1c581e9748cda91fJosé Fonseca
1093469715a8a171512cf9b528702e70393f01c6041José Fonsecavoid
1103469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_build_transpose_aos(struct gallivm_state *gallivm,
1113469715a8a171512cf9b528702e70393f01c6041José Fonseca                       struct lp_type type,
1123469715a8a171512cf9b528702e70393f01c6041José Fonseca                       const LLVMValueRef src[4],
1133469715a8a171512cf9b528702e70393f01c6041José Fonseca                       LLVMValueRef dst[4]);
1143469715a8a171512cf9b528702e70393f01c6041José Fonseca
1153469715a8a171512cf9b528702e70393f01c6041José Fonseca
1163469715a8a171512cf9b528702e70393f01c6041José FonsecaLLVMValueRef
1173469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_build_pack_aos_scalars(struct gallivm_state *gallivm,
1183469715a8a171512cf9b528702e70393f01c6041José Fonseca                          struct lp_type src_type,
1193469715a8a171512cf9b528702e70393f01c6041José Fonseca                          struct lp_type dst_type,
1203469715a8a171512cf9b528702e70393f01c6041José Fonseca                          const LLVMValueRef src);
1213469715a8a171512cf9b528702e70393f01c6041José Fonseca
1223469715a8a171512cf9b528702e70393f01c6041José Fonseca
1233469715a8a171512cf9b528702e70393f01c6041José FonsecaLLVMValueRef
1243469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_build_unpack_broadcast_aos_scalars(struct gallivm_state *gallivm,
1253469715a8a171512cf9b528702e70393f01c6041José Fonseca                                      struct lp_type src_type,
1263469715a8a171512cf9b528702e70393f01c6041José Fonseca                                      struct lp_type dst_type,
1273469715a8a171512cf9b528702e70393f01c6041José Fonseca                                      const LLVMValueRef src);
1283469715a8a171512cf9b528702e70393f01c6041José Fonseca
1293469715a8a171512cf9b528702e70393f01c6041José Fonseca
1301dd7bb17c7331f9ecd0bc830b61ada235a56fe6dJosé Fonseca#endif /* !LP_BLD_SWIZZLE_H */
131