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