1f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca/**************************************************************************
2f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca *
3f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * Copyright 2009 VMware, Inc.
4f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * All Rights Reserved.
5f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca *
6f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * copy of this software and associated documentation files (the
8f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * "Software"), to deal in the Software without restriction, including
9f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * the following conditions:
13f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca *
14f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * The above copyright notice and this permission notice (including the
15f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * next paragraph) shall be included in all copies or substantial portions
16f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * of the Software.
17f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca *
18f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca *
26f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca **************************************************************************/
27f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
28f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca/**
29f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * @file
30f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * Position and shader input interpolation.
31f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca *
32f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * Special attention is given to the interpolation of side by side quads.
33f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * Multiplications are made only for the first quad. Interpolation of
34f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * inputs for posterior quads are done exclusively with additions, and
35f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * perspective divide if necessary.
36f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca *
37f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
38f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca */
39f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
40f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca#ifndef LP_BLD_INTERP_H
41f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca#define LP_BLD_INTERP_H
42f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
43f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
440d71ba46e613230c84165106c1fcc9027dec4cd3Brian Paul#include "gallivm/lp_bld.h"
45cf88dcf7313b6a0112c36c2f05ce6a7e846d268cBrian Paul#include "gallivm/lp_bld_type.h"
46f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
47f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca#include "tgsi/tgsi_exec.h"
48f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
495b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell/**
505b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell * Describes how to compute the interpolation coefficients (a0, dadx, dady)
515b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell * from the vertices passed into our triangle/line/point functions by the
525b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell * draw module.
535b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell *
545b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell * Vertices are treated as an array of float[4] values, indexed by
555b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell * src_index.
565b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell *
575b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell * LP_INTERP_COLOR is translated to either LP_INTERP_CONSTANT or
58982df3c1a5e99e43f28f849419d4379e6e5d5d05Olivier Galibert * PERSPECTIVE depending on flatshade state.
595b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell */
605b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwellenum lp_interp {
615b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_INTERP_CONSTANT,
625b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_INTERP_COLOR,
635b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_INTERP_LINEAR,
645b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_INTERP_PERSPECTIVE,
655b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_INTERP_POSITION,
665b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_INTERP_FACING
675b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell};
685b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
695b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwellstruct lp_shader_input {
70f34e2f484bb73bba79a5b3fa7cff2e79bc7f0cf9James Benton   uint interp:4;       /* enum lp_interp */
71f34e2f484bb73bba79a5b3fa7cff2e79bc7f0cf9James Benton   uint usage_mask:4;   /* bitmask of TGSI_WRITEMASK_x flags */
72f34e2f484bb73bba79a5b3fa7cff2e79bc7f0cf9James Benton   uint src_index:8;    /* where to find values in incoming vertices */
73f34e2f484bb73bba79a5b3fa7cff2e79bc7f0cf9James Benton   uint cyl_wrap:4;     /* TGSI_CYLINDRICAL_WRAP_x flags */
74f34e2f484bb73bba79a5b3fa7cff2e79bc7f0cf9James Benton   uint padding:12;
755b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell};
76f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
77f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
78f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonsecastruct lp_build_interp_soa_context
79f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca{
806b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard   /* TGSI_QUAD_SIZE x float */
815871b7ebc9f9629c076c9fe3c9c32aa9fd531ebaJosé Fonseca   struct lp_build_context coeff_bld;
823469715a8a171512cf9b528702e70393f01c6041José Fonseca   struct lp_build_context setup_bld;
83f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
84f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   unsigned num_attribs;
85ab065b933bde4fd1079f0d37a4571cdfd1619407Brian Paul   unsigned mask[1 + PIPE_MAX_SHADER_INPUTS]; /**< TGSI_WRITE_MASK_x */
866ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca   enum lp_interp interp[1 + PIPE_MAX_SHADER_INPUTS];
8770a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger   boolean simple_interp;
8870a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger   boolean dynamic_offsets;
89f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
90ead58101f91e82279b25676dfe822120be611995José Fonseca   LLVMValueRef x;
91ead58101f91e82279b25676dfe822120be611995José Fonseca   LLVMValueRef y;
92f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
933469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMValueRef a[1 + PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS];
946b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard   LLVMValueRef dadq[1 + PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS];
953469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMValueRef a0aos[1 + PIPE_MAX_SHADER_INPUTS];
963469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMValueRef dadxaos[1 + PIPE_MAX_SHADER_INPUTS];
973469715a8a171512cf9b528702e70393f01c6041José Fonseca   LLVMValueRef dadyaos[1 + PIPE_MAX_SHADER_INPUTS];
98f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
99d278ddc00966b6348eb4703b12166c05cf539635José Fonseca   LLVMValueRef oow;
100d278ddc00966b6348eb4703b12166c05cf539635José Fonseca
1016b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard   LLVMValueRef attribs[1 + PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS];
102f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
10370a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger   LLVMValueRef xoffset_store;
10470a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger   LLVMValueRef yoffset_store;
10570a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger
106f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   /*
107f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca    * Convenience pointers. Callers may access this one.
108f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca    */
109f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
1106b63e25b3d7a6ac0bd738c139ead0c7e7ad84368Tom Stellard   const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS];
111f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca};
112f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
113f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
114f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonsecavoid
115f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonsecalp_build_interp_soa_init(struct lp_build_interp_soa_context *bld,
116efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                         struct gallivm_state *gallivm,
1176ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca                         unsigned num_inputs,
1186ce68ad3ca242076bbb93fdd99bb448f87a31d15José Fonseca                         const struct lp_shader_input *inputs,
119f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                         LLVMBuilderRef builder,
120b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                         struct lp_type type,
12170a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger                         boolean dynamic_offsets,
122f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                         LLVMValueRef a0_ptr,
123f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                         LLVMValueRef dadx_ptr,
124f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                         LLVMValueRef dady_ptr,
125147dc2354c21f098a2a63a085c21ec10252cab24José Fonseca                         LLVMValueRef x,
126147dc2354c21f098a2a63a085c21ec10252cab24José Fonseca                         LLVMValueRef y);
127f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
128f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonsecavoid
1298009886b0092df2783472deaac1bcaad4a802c19Keith Whitwelllp_build_interp_soa_update_inputs(struct lp_build_interp_soa_context *bld,
130efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                                  struct gallivm_state *gallivm,
1313469715a8a171512cf9b528702e70393f01c6041José Fonseca                                  int quad_start_index);
1328009886b0092df2783472deaac1bcaad4a802c19Keith Whitwell
1338009886b0092df2783472deaac1bcaad4a802c19Keith Whitwellvoid
1348009886b0092df2783472deaac1bcaad4a802c19Keith Whitwelllp_build_interp_soa_update_pos(struct lp_build_interp_soa_context *bld,
135efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                               struct gallivm_state *gallivm,
1363469715a8a171512cf9b528702e70393f01c6041José Fonseca                               int quad__start_index);
137f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
13870a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheideggervoid
13970a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheideggerlp_build_interp_soa_update_inputs_dyn(struct lp_build_interp_soa_context *bld,
14070a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger                                      struct gallivm_state *gallivm,
14170a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger                                      LLVMValueRef quad_start_index);
14270a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger
14370a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheideggervoid
14470a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheideggerlp_build_interp_soa_update_pos_dyn(struct lp_build_interp_soa_context *bld,
14570a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger                                   struct gallivm_state *gallivm,
14670a969f123c98cf6fca71a5fed4efed983edf6c8Roland Scheidegger                                   LLVMValueRef quad_start_index);
147f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca
148f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca#endif /* LP_BLD_INTERP_H */
149