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