lp_bld_tgsi.h revision 141f2c2fc9325a5d30629373bb962f42517967ae
19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek/************************************************************************** 29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * 39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * Copyright 2011-2012 Advanced Micro Devices, Inc. 49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * Copyright 2009 VMware, Inc. 59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * All Rights Reserved. 69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * 79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * Permission is hereby granted, free of charge, to any person obtaining a 89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * copy of this software and associated documentation files (the 99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * "Software"), to deal in the Software without restriction, including 109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * without limitation the rights to use, copy, modify, merge, publish, 119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * distribute, sub license, and/or sell copies of the Software, and to 129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * permit persons to whom the Software is furnished to do so, subject to 139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * the following conditions: 149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * 159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * The above copyright notice and this permission notice (including the 165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis * next paragraph) shall be included in all copies or substantial portions 175a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis * of the Software. 189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * 19478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 209ff2b13aee0f89d23ef4820218f9b88bb5e5c1c1Ken Dyck * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 224c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenek * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 23d47d3b0cfeb7e8564ff77f48130fe63282b6d127Chris Lattner * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2630a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth * 279e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek **************************************************************************/ 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 295e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer/** 305e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer * @file 315e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer * TGSI to LLVM IR translation. 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * @author Jose Fonseca <jfonseca@vmware.com> 341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * @author Tom Stellard <thomas.stellard@amd.com> 35d17da2b99f323fa91b01e1dd119cc32e0ee8197dTed Kremenek */ 3667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 375a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LP_BLD_TGSI_H 389ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek#define LP_BLD_TGSI_H 395a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#include "gallivm/lp_bld.h" 415a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#include "gallivm/lp_bld_tgsi_action.h" 42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek#include "gallivm/lp_bld_limits.h" 434240096011a187807058f887eb81df750ffa17feTed Kremenek#include "lp_bld_type.h" 44dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek#include "pipe/p_compiler.h" 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "pipe/p_state.h" 46e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu#include "tgsi/tgsi_exec.h" 47e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu#include "tgsi/tgsi_scan.h" 48e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu#include "tgsi/tgsi_info.h" 49e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 50e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu#define LP_CHAN_ALL ~0 51e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 52e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xu#define LP_MAX_INSTRUCTIONS 256 53e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 54e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xustruct tgsi_full_declaration; 555375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballmanstruct tgsi_full_immediate; 565375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballmanstruct tgsi_full_instruction; 575375d82d1d096ddd8879d8e6641a8f042b0d1d43Aaron Ballmanstruct tgsi_full_src_register; 58824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rosestruct tgsi_opcode_info; 59e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rosestruct tgsi_token; 60e3273e78da4716f9c999ae207f6898f376a6e1a4Zhongxing Xustruct tgsi_shader_info; 61e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xustruct lp_build_mask_context; 62e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xustruct gallivm_state; 63824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 64824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose 65824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Roseenum lp_build_tex_modifier { 66824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose LP_BLD_TEX_MODIFIER_NONE = 0, 67824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose LP_BLD_TEX_MODIFIER_PROJECTED, 68824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose LP_BLD_TEX_MODIFIER_LOD_BIAS, 69824e07ac8f5c9efdddb4254de0203b9675b1ef0bJordan Rose LP_BLD_TEX_MODIFIER_EXPLICIT_LOD, 70e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV 71e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose}; 72e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 73e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu 7419e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek/** 7519e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek * Describe a channel of a register. 7619e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek * 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * The value can be a: 789e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * - immediate value (i.e. derived from a IMM register) 799e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * - CONST[n].x/y/z/w 804240096011a187807058f887eb81df750ffa17feTed Kremenek * - IN[n].x/y/z/w 819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * - undetermined (when .file == TGSI_FILE_NULL) 8267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * 8367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * This is one of the analysis results, and is used to described 84dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek * the output color in terms of inputs. 8567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek */ 8667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekstruct lp_tgsi_channel_info 8767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek{ 882b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek unsigned file:4; /* TGSI_FILE_* */ 89dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek unsigned swizzle:3; /* PIPE_SWIZZLE_x */ 90eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks union { 91eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks uint32_t index; 92eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks float value; /* for TGSI_FILE_IMMEDIATE */ 93eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } u; 94eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks}; 95eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 96eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 97dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek/** 98eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks * Describe a texture sampler interpolator. 9967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * 10067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * The interpolation is described in terms of regular inputs. 10167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek */ 10267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekstruct lp_tgsi_texture_info 10367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek{ 10467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct lp_tgsi_channel_info coord[4]; 10567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek unsigned target:8; /* TGSI_TEXTURE_* */ 1068ecf59afbab1dbf184dc4c0c47e7213cbd32ba0aJordan Rose unsigned unit:8; /* Sampler unit */ 1079697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned modifier:8; /* LP_BLD_TEX_MODIFIER_* */ 1089697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek}; 109de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek 11067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 1114c62b557e269a27515dfca1f754ae936c8fdb824Ted Kremenekstruct lp_tgsi_info 11267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek{ 11367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct tgsi_shader_info base; 11467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 11567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /* 11667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * Whether any of the texture opcodes access a register file other than 11767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * TGSI_FILE_INPUT. 1184fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu * 11902fe28c8a6da29d4ad88d0900c133dcf22d24a75Zhongxing Xu * We could also handle TGSI_FILE_CONST/IMMEDIATE here, but there is little 1204fd56816e0925c04f2c92e75399f5c9018d5d6fbZhongxing Xu * benefit. 121096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose */ 122096aef9597b263b4cd6a0feaacf9e7214fa9c75aJordy Rose unsigned indirect_textures:1; 12367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 12467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /* 1259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * Texture opcode description. Aimed at detecting and described direct 1269e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * texture opcodes. 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */ 1289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned num_texs; 1299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek struct lp_tgsi_texture_info tex[PIPE_MAX_SAMPLERS]; 1309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 1319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /* 1329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek * Output description. Aimed at detecting and describing simple blit 133a6275a534da701f37d19a068e6361e5f10f983a1Ted Kremenek * shaders. 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */ 1359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek struct lp_tgsi_channel_info output[PIPE_MAX_SHADER_OUTPUTS][4]; 136a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 137a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek /* 138a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek * Shortcut pointers into the above (for fragment shaders). 139bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek */ 1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const struct lp_tgsi_channel_info *cbuf[PIPE_MAX_COLOR_BUFS]; 141adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu}; 142adca27102ff733c7d42fcbbc2c7e134a7fc026f9Zhongxing Xu 143522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks/** 1445f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks * Sampler code generation interface. 145522fc21f3adc647817edc8017e6928a64c96899bAnna Zaks * 146b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose * Although texture sampling is a requirement for TGSI translation, it is 1471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * a very different problem with several different approaches to it. This 1481508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek * structure establishes an interface for texture sampling code generation, so 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * that we can easily use different texture sampling strategies. 150de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek */ 151de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenekstruct lp_build_sampler_soa 152de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek{ 153de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek void 154de0d26310191215a6d1d189dc419f87af18ce6beTed Kremenek (*destroy)( struct lp_build_sampler_soa *sampler ); 155b21ff77c8126ea628b66d2ffb931fdaa7884f5d2Zhongxing Xu 156e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu void 157e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu (*emit_fetch_texel)( const struct lp_build_sampler_soa *sampler, 158e888233f6b115d3b0dd73bcb5f35e93794408542Zhongxing Xu struct gallivm_state *gallivm, 1593d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks struct lp_type type, 1603d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks unsigned unit, 1613d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks unsigned num_coords, 1629c378f705405d37f49795d5e915989de774fe11fTed Kremenek const LLVMValueRef *coords, 1637f39d29cb69e7488f994870800d548008e50e1cbTed Kremenek const LLVMValueRef *ddx, 1648800ad4eaa1621f6d23c8264971063b9f8da6a2eTed Kremenek const LLVMValueRef *ddy, 1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LLVMValueRef lod_bias, /* optional */ 166919e8a1c6698bfa6848571d366430126bced727dJordan Rose LLVMValueRef explicit_lod, /* optional */ 167919e8a1c6698bfa6848571d366430126bced727dJordan Rose LLVMValueRef *texel); 168919e8a1c6698bfa6848571d366430126bced727dJordan Rose}; 1693d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaks 170919e8a1c6698bfa6848571d366430126bced727dJordan Rose 1713d7c44e01d568e5d5c0fac9c6ccb3f080157ba19Anna Zaksstruct lp_build_sampler_aos 1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{ 1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LLVMValueRef 174ed65d3d97132fbcdd124aef4d2478e348dfbd36bTed Kremenek (*emit_fetch_texel)( struct lp_build_sampler_aos *sampler, 1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump struct lp_build_context *bld, 176f0f0605c87739c906861f73d4287798a4969b1e0Zhongxing Xu unsigned target, /* TGSI_TEXTURE_* */ 1779e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned unit, 1781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LLVMValueRef coords, 179eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef ddx, 1809e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek LLVMValueRef ddy, 1819e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek enum lp_build_tex_modifier modifier); 182a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek}; 18367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 185a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekvoid 186a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremeneklp_build_tgsi_info(const struct tgsi_token *tokens, 18767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct lp_tgsi_info *info); 18867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 18967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 19067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid 19167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremeneklp_build_tgsi_soa(struct gallivm_state *gallivm, 19267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const struct tgsi_token *tokens, 1931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump struct lp_type type, 19467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct lp_build_mask_context *mask, 19567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef consts_ptr, 19667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef system_values_array, 19767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LLVMValueRef *pos, 19867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LLVMValueRef (*inputs)[4], 19967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef (*outputs)[4], 20067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct lp_build_sampler_soa *sampler, 20167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const struct tgsi_shader_info *info); 202a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 20367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 20467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid 20567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremeneklp_build_tgsi_aos(struct gallivm_state *gallivm, 20699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie const struct tgsi_token *tokens, 207dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek struct lp_type type, 208dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const unsigned char swizzles[4], 209dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef consts_ptr, 210dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const LLVMValueRef *inputs, 211dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef *outputs, 212dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek struct lp_build_sampler_aos *sampler, 213dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek const struct tgsi_shader_info *info); 214dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 215dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 216eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna ZaksLLVMValueRef 217914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikielp_build_system_values_array(struct gallivm_state *gallivm, 218eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const struct tgsi_shader_info *info, 219914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie LLVMValueRef instance_id, 220eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef facing); 221eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 222dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 22367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekstruct lp_exec_mask { 224a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek struct lp_build_context *bld; 225dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 226dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek boolean has_mask; 227dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 228dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMTypeRef int_vec_type; 229dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek 230dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef cond_stack[LP_MAX_TGSI_NESTING]; 231dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek int cond_stack_size; 232dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef cond_mask; 2339c378f705405d37f49795d5e915989de774fe11fTed Kremenek 234fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenek LLVMBasicBlockRef loop_block; 235dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef cont_mask; 236dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef break_mask; 237dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef break_var; 238dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek struct { 239dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMBasicBlockRef loop_block; 240dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef cont_mask; 241eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef break_mask; 242914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie LLVMValueRef break_var; 243eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks } loop_stack[LP_MAX_TGSI_NESTING]; 244eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks int loop_stack_size; 245eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 246eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef ret_mask; 247eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct { 248dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek int pc; 249dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek LLVMValueRef ret_mask; 250dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek } call_stack[LP_MAX_TGSI_NESTING]; 251eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks int call_stack_size; 252eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 253eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef exec_mask; 254dcee3ce97fc76f20ce8f5a7451071e3dec537073Ted Kremenek}; 2559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 256fa87d812d7c78d7f0cd1c5636e21e07c23c85341Ted Kremenekstruct lp_build_tgsi_inst_list 25767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek{ 258eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct tgsi_full_instruction *instructions; 259eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks uint max_instructions; 260eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks uint num_instructions; 26167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 26267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 263eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksunsigned lp_bld_tgsi_list_init(struct lp_build_tgsi_context * bld_base); 264914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie 265eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 266eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksunsigned lp_bld_tgsi_add_instruction( 267eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct lp_build_tgsi_context * bld_base, 268eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct tgsi_full_instruction *inst_to_add); 269eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 270eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 271eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksstruct lp_build_tgsi_context; 272eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 273eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 274eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zakstypedef LLVMValueRef (*lp_build_emit_fetch_fn)(struct lp_build_tgsi_context *, 275eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const struct tgsi_full_src_register *, 276eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks enum tgsi_opcode_type, 277eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks unsigned); 278eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 279eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaksstruct lp_build_tgsi_context 280eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks{ 281914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie struct lp_build_context base; 282eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 283eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct lp_build_context uint_bld; 284eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct lp_build_context int_bld; 285eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 286eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks /** This array stores functions that are used to transform TGSI opcodes to 287eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks * LLVM instructions. 288eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks */ 289eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct lp_build_tgsi_action op_actions[TGSI_OPCODE_LAST]; 290eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 291eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks /* TGSI_OPCODE_RSQ is defined as 1 / sqrt( abs(src0.x) ), rsq_action 292eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks * should compute 1 / sqrt (src0.x) */ 293eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks struct lp_build_tgsi_action rsq_action; 294eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 295eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const struct tgsi_shader_info *info; 296eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 297eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks lp_build_emit_fetch_fn emit_fetch_funcs[TGSI_FILE_COUNT]; 298eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 299eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef (*emit_swizzle)(struct lp_build_tgsi_context *, 300eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef, unsigned, unsigned, unsigned, unsigned); 301914edfbb07c34d8cad8d0451193b4f9dd02a2d5aDavid Blaikie 302eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void (*emit_store)(struct lp_build_tgsi_context *, 303eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const struct tgsi_full_instruction *, 304eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const struct tgsi_opcode_info *, 305eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks LLVMValueRef dst[4]); 306eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 307eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void (*emit_declaration)(struct lp_build_tgsi_context *, 308eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const struct tgsi_full_declaration *decl); 309eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 310eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void (*emit_immediate)(struct lp_build_tgsi_context *, 311eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks const struct tgsi_full_immediate *imm); 312eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 313eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 314eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks /* Allow the user to store data in this structure rather than passing it 315eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks * to every function. */ 316eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks void * userdata; 317eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks 318eb31a76d1cdaaf8874c549dc6bd964ff270d3822Anna Zaks boolean soa; 31967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 32099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie int pc; 32167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 32267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct tgsi_full_instruction *instructions; 32367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek uint max_instructions; 32467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek uint num_instructions; 32567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 32636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose /** This function allows the user to insert some instructions at the 32736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose * beginning of the program. It is optional and does not need to be 32836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose * implemented. 32967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek */ 33067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek void (*emit_prologue)(struct lp_build_tgsi_context*); 33167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 33267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /** This function allows the user to insert some instructions at the end of 33367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * the program. This callback is intended to be used for emitting 3342b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek * instructions to handle the export for the output registers, but it can 33599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie * be used for any purpose. Implementing this function is optiona, but 3362b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek * recommended. 3372b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek */ 3382b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek void (*emit_epilogue)(struct lp_build_tgsi_context*); 3392b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek}; 34036397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 34136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rosestruct lp_build_tgsi_soa_context 34236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose{ 3432b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek struct lp_build_tgsi_context bld_base; 3442b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 3452b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek /* Builder for scalar elements of shader's data type (float) */ 3462b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek struct lp_build_context elem_bld; 3472b87ae45e129b941d0a4d221c9d4842385a119bdTed Kremenek 34867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef consts_ptr; 34967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LLVMValueRef *pos; 35067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS]; 3519e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS]; 35267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 35367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const struct lp_build_sampler_soa *sampler; 35467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 35567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][TGSI_NUM_CHANNELS]; 35667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef temps[LP_MAX_TGSI_TEMPS][TGSI_NUM_CHANNELS]; 35741168eac256fed59ec5406a75fce91c59cd5dd91Ted Kremenek LLVMValueRef addr[LP_MAX_TGSI_ADDRS][TGSI_NUM_CHANNELS]; 35867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef preds[LP_MAX_TGSI_PREDS][TGSI_NUM_CHANNELS]; 35967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is 36167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * set in the indirect_files field. 36267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * The temps[] array above is unused then. 36367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek */ 36467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef temps_array; 36567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 36667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /* We allocate/use this array of output if (1 << TGSI_FILE_OUTPUT) is 36767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * set in the indirect_files field. 36867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * The outputs[] array above is unused then. 36967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek */ 37067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LLVMValueRef outputs_array; 37199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 37267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /* We allocate/use this array of inputs if (1 << TGSI_FILE_INPUT) is 37367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * set in the indirect_files field. 37467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek * The inputs[] array above is unused then. 37567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek */ 37636397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose LLVMValueRef inputs_array; 37736397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose 37836397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose LLVMValueRef system_values_array; 37967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 38067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek /** bitmask indicating which register files are accessed indirectly */ 38167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek unsigned indirect_files; 38267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 38367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct lp_build_mask_context *mask; 38467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct lp_exec_mask exec_mask; 38567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 38699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie uint num_immediates; 38767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 38867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek}; 38967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 39067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid 39136397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Roselp_emit_declaration_soa( 39236397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose struct lp_build_tgsi_context *bld, 39336397dc6c1bf1513a3bac4eabe9209e5b2295a55Jordan Rose const struct tgsi_full_declaration *decl); 39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 39567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekvoid lp_emit_immediate_soa( 3969e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek struct lp_build_tgsi_context *bld_base, 3979e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const struct tgsi_full_immediate *imm); 3989e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 3997caf9b369cba6edaf6eac25121cbc65ee938f14dZhongxing Xuboolean 400993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremeneklp_emit_instruction_soa( 401993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek struct lp_build_tgsi_soa_context *bld, 402993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek const struct tgsi_full_instruction *inst, 40399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie const struct tgsi_opcode_info *info); 40499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 4059e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpLLVMValueRef 407993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremeneklp_get_temp_ptr_soa( 4089e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek struct lp_build_tgsi_soa_context *bld, 4099e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned index, 4109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek unsigned chan); 4119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 4121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpLLVMValueRef 41332f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Roselp_get_output_ptr( 414c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek struct lp_build_tgsi_soa_context *bld, 41532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose unsigned index, 41632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose unsigned chan); 41732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose 418a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenekstruct lp_build_tgsi_aos_context 4191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{ 4205f7c0add1ea1d8e1d2f920d77fd1a7b6160c2d93Anna Zaks struct lp_build_tgsi_context bld_base; 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4229e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek /* Builder for integer masks and indices */ 42367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek struct lp_build_context int_bld; 424993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 425993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek /* 4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * AoS swizzle used: 42719e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek * - swizzles[0] = red index 42819e1f0ba5cec738ce6cebe3fe0e1edc782206494Ted Kremenek * - swizzles[1] = green index 4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * - swizzles[2] = blue index 430ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xu * - swizzles[3] = alpha index 43182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek */ 43282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned char swizzles[4]; 43382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek unsigned char inv_swizzles[4]; 43482bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 43582bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek LLVMValueRef consts_ptr; 43682bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek const LLVMValueRef *inputs; 43782bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek LLVMValueRef *outputs; 4389c378f705405d37f49795d5e915989de774fe11fTed Kremenek 43982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek struct lp_build_sampler_aos *sampler; 4409c378f705405d37f49795d5e915989de774fe11fTed Kremenek 44182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES]; 4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LLVMValueRef temps[LP_MAX_TGSI_TEMPS]; 44382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek LLVMValueRef addr[LP_MAX_TGSI_ADDRS]; 4441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LLVMValueRef preds[LP_MAX_TGSI_PREDS]; 4459c378f705405d37f49795d5e915989de774fe11fTed Kremenek 4469852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is 4479852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu * set in the indirect_files field. 4489852b5bf94d4934de63da6356c651c61e81f58d9Zhongxing Xu * The temps[] array above is unused then. 449c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek */ 45032f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose LLVMValueRef temps_array; 45182bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek 45282bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek /** bitmask indicating which register files are accessed indirectly */ 4539c378f705405d37f49795d5e915989de774fe11fTed Kremenek unsigned indirect_files; 4547ae7ad9951f032d0a33b64c964f7cdcb9cc6f59bTed Kremenek 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}; 4569c378f705405d37f49795d5e915989de774fe11fTed Kremenek 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic INLINE struct lp_build_tgsi_soa_context * 45882bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremeneklp_soa_context(struct lp_build_tgsi_context *bld_base) 45982bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek{ 46082bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek return (struct lp_build_tgsi_soa_context *)bld_base; 4611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 4621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 463993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekstatic INLINE struct lp_build_tgsi_aos_context * 464993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremeneklp_aos_context(struct lp_build_tgsi_context *bld_base) 46599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie{ 46699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie return (struct lp_build_tgsi_aos_context *)bld_base; 467993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek} 468993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 470993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremeneklp_emit_declaration_aos( 4719697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek struct lp_build_tgsi_aos_context *bld, 4729697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek const struct tgsi_full_declaration *decl); 4739697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4749697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4759697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekboolean 4769697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremeneklp_emit_instruction_aos( 4779697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek struct lp_build_tgsi_aos_context *bld, 4789697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek const struct tgsi_full_instruction *inst, 4799697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek const struct tgsi_opcode_info *info, 4809697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek int *pc); 4819697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 4829697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekvoid 4839697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremeneklp_emit_store_aos( 4849697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek struct lp_build_tgsi_aos_context *bld, 4859697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek const struct tgsi_full_instruction *inst, 4869697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned index, 48799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie LLVMValueRef value); 48899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 4899697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenekvoid lp_build_fetch_args( 4909697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek struct lp_build_tgsi_context * bld_base, 4919697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek struct lp_build_emit_data * emit_data); 4929697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek 493018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing XuLLVMValueRef 4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumplp_build_tgsi_inst_llvm_aos( 495018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu struct lp_build_tgsi_context * bld_base, 4966eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek const struct tgsi_full_instruction *inst); 497a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek 498a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenekvoid 499a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremeneklp_build_tgsi_intrinsic( 500a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek const struct lp_build_tgsi_action * action, 501a6b0b96e5376cd9cf182a3e240e0537feed43cdeTed Kremenek struct lp_build_tgsi_context * bld_base, 5026eddeb153415049c7b62de4b45385a759a6906c6Ted Kremenek struct lp_build_emit_data * emit_data); 5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50449f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCallLLVMValueRef 505018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xulp_build_emit_llvm( 5061ab55e9bb87d98bff1d42c7a0ee502c64755d9f5Douglas Gregor struct lp_build_tgsi_context *bld_base, 50714553abd17d303b0b310b3ab1523eb0d30d8121cTed Kremenek unsigned tgsi_opcode, 5081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump struct lp_build_emit_data * emit_data); 509e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan Rose 510e0d24eb1060a213ec9820dc02c45f26b2d5b348bJordan RoseLLVMValueRef 511993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremeneklp_build_emit_llvm_unary( 5129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek struct lp_build_tgsi_context *bld_base, 5139697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek unsigned tgsi_opcode, 5149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek LLVMValueRef arg0); 5159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 5169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed KremenekLLVMValueRef 517ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xulp_build_emit_llvm_binary( 518eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek struct lp_build_tgsi_context *bld_base, 51999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie unsigned tgsi_opcode, 52099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie LLVMValueRef arg0, 521eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek LLVMValueRef arg1); 522eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 523ec13d9206645af07ef7c571405893b8d901de151Zhongxing XuLLVMValueRef 524eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremeneklp_build_emit_llvm_ternary( 525eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek struct lp_build_tgsi_context *bld_base, 526eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek unsigned tgsi_opcode, 527eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek LLVMValueRef arg0, 528eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek LLVMValueRef arg1, 529eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek LLVMValueRef arg2); 530eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 531ec13d9206645af07ef7c571405893b8d901de151Zhongxing Xuboolean 532eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremeneklp_build_tgsi_inst_llvm( 533eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek struct lp_build_tgsi_context * bld_base, 5345fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const struct tgsi_full_instruction *inst); 535eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek 5365fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna ZaksLLVMValueRef 5375fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zakslp_build_emit_fetch( 5385fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks struct lp_build_tgsi_context *bld_base, 5395fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const struct tgsi_full_instruction *inst, 540eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek unsigned src_op, 541018220c343c103b7dfaa117a7a474c7a7fd6d068Zhongxing Xu const unsigned chan_index); 5425fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5435fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaksboolean 5445fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zakslp_build_tgsi_llvm( 5455fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks struct lp_build_tgsi_context * bld_base, 5465fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks const struct tgsi_token *tokens); 5475fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks 5485fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks#endif /* LP_BLD_TGSI_H */ 5495fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks