lp_setup_point.c revision 986cb9d5cf60bc11c7facc19017b5432b17240f7
1415b271b5100d64579690111bc8eb549866865a7Keith Whitwell/************************************************************************** 2415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * 357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Copyright 2010, VMware Inc. 4415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * All Rights Reserved. 5415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * 6415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 7415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * copy of this software and associated documentation files (the 8415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * "Software"), to deal in the Software without restriction, including 9415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 10415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 11415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 12415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * the following conditions: 13415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * 14415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * The above copyright notice and this permission notice (including the 15415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 16415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * of the Software. 17415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * 18415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * 26415b271b5100d64579690111bc8eb549866865a7Keith Whitwell **************************************************************************/ 27415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 28415b271b5100d64579690111bc8eb549866865a7Keith Whitwell/* 29415b271b5100d64579690111bc8eb549866865a7Keith Whitwell * Binning code for points 30415b271b5100d64579690111bc8eb549866865a7Keith Whitwell */ 31415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 32415b271b5100d64579690111bc8eb549866865a7Keith Whitwell#include "lp_setup_context.h" 3357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#include "util/u_math.h" 3457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#include "util/u_memory.h" 3557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#include "lp_perf.h" 3657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#include "lp_rast.h" 3757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#include "lp_state_fs.h" 3829ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay#include "tgsi/tgsi_scan.h" 3957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 4057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#define NUM_CHANNELS 4 4157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 4257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystruct point_info { 4357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* x,y deltas */ 4457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay int dy01, dy12; 4557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay int dx01, dx12; 4657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 4757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay const float (*v0)[4]; 4857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}; 4957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 5057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 5157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay/** 5257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Compute a0 for a constant-valued coefficient (GL_FLAT shading). 5357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 54924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulstatic void 55924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulconstant_coef(struct lp_setup_context *setup, 56924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul struct lp_rast_triangle *point, 57924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul unsigned slot, 58924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul const float value, 59924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul unsigned i) 6057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{ 6157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.a0[slot][i] = value; 6257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.dadx[slot][i] = 0.0f; 6357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.dady[slot][i] = 0.0f; 6457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay} 6557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 66924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul 67e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonsecastatic void 68e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonsecapoint_persp_coeff(struct lp_setup_context *setup, 69e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca struct lp_rast_triangle *point, 70e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca const struct point_info *info, 71e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca unsigned slot, 72e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca unsigned i) 73e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca{ 74e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca /* 75e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca * Fragment shader expects pre-multiplied w for LP_INTERP_PERSPECTIVE. A 76e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca * better stratergy would be to take the primitive in consideration when 77e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca * generating the fragment shader key, and therefore avoid the per-fragment 78e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca * perspective divide. 79e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca */ 80e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca 81e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca float w0 = info->v0[0][3]; 82e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca 83e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca assert(i < 4); 84e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca 85e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca point->inputs.a0[slot][i] = info->v0[slot][i]*w0; 86e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca point->inputs.dadx[slot][i] = 0.0f; 87e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca point->inputs.dady[slot][i] = 0.0f; 88e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca} 89e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca 90e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca 91516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul/** 92516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * Setup automatic texcoord coefficients (for sprite rendering). 93516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * \param slot the vertex attribute slot to setup 94516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * \param i the attribute channel in [0,3] 95516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * \param sprite_coord_origin one of PIPE_SPRITE_COORD_x 96e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca * \param perspective does the shader expects pre-multiplied w, i.e., 97e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca * LP_INTERP_PERSPECTIVE is specified in the shader key 98516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul */ 99924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulstatic void 100516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paultexcoord_coef(struct lp_setup_context *setup, 101516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul struct lp_rast_triangle *point, 102516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul const struct point_info *info, 103516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul unsigned slot, 104516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul unsigned i, 105516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul unsigned sprite_coord_origin, 106e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca boolean perspective) 10729ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay{ 10806472ad7e835813ef7c9bf8a5cd8b62a25fa9cc3José Fonseca float w0 = info->v0[0][3]; 10906472ad7e835813ef7c9bf8a5cd8b62a25fa9cc3José Fonseca 110516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul assert(i < 4); 111516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul 112924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul if (i == 0) { 113924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul float dadx = FIXED_ONE / (float)info->dx12; 11429ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay float dady = 0.0f; 115516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul float x0 = info->v0[0][0] - setup->pixel_offset; 116516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul float y0 = info->v0[0][1] - setup->pixel_offset; 117516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul 118516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dadx[slot][0] = dadx; 119516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dady[slot][0] = dady; 120516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.a0[slot][0] = 0.5 - (dadx * x0 + dady * y0); 121516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul 122e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca if (perspective) { 123516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dadx[slot][0] *= w0; 124516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dady[slot][0] *= w0; 125516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.a0[slot][0] *= w0; 126516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul } 12729ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay } 12829ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay else if (i == 1) { 12961fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul float dadx = 0.0f; 13061fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul float dady = FIXED_ONE / (float)info->dx12; 131516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul float x0 = info->v0[0][0] - setup->pixel_offset; 132516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul float y0 = info->v0[0][1] - setup->pixel_offset; 13361fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul 13461fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul if (sprite_coord_origin == PIPE_SPRITE_COORD_LOWER_LEFT) { 13561fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul dady = -dady; 13661fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul } 137924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul 138516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dadx[slot][1] = dadx; 139516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dady[slot][1] = dady; 140516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.a0[slot][1] = 0.5 - (dadx * x0 + dady * y0); 141516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul 142e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca if (perspective) { 143516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dadx[slot][1] *= w0; 144516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dady[slot][1] *= w0; 145516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.a0[slot][1] *= w0; 146516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul } 14729ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay } 14829ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay else if (i == 2) { 149516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.a0[slot][2] = 0.0f; 150516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dadx[slot][2] = 0.0f; 151516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dady[slot][2] = 0.0f; 15229ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay } 153516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul else { 15406472ad7e835813ef7c9bf8a5cd8b62a25fa9cc3José Fonseca point->inputs.a0[slot][3] = perspective ? w0 : 1.0f; 155516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dadx[slot][3] = 0.0f; 156516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul point->inputs.dady[slot][3] = 0.0f; 15729ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay } 15829ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay} 15929ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay 16029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay 16157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay/** 16257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Special coefficient setup for gl_FragCoord. 16357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * X and Y are trivial 16457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Z and W are copied from position_coef which should have already been computed. 16557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * We could do a bit less work if we'd examine gl_FragCoord's swizzle mask. 16657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 16757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystatic void 16857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taysetup_point_fragcoord_coef(struct lp_setup_context *setup, 16957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay struct lp_rast_triangle *point, 17057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay const struct point_info *info, 17157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned slot, 17257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned usage_mask) 17357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{ 17457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /*X*/ 17557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay if (usage_mask & TGSI_WRITEMASK_X) { 17657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.a0[slot][0] = 0.0; 17757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.dadx[slot][0] = 1.0; 17857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.dady[slot][0] = 0.0; 17957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 18057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 18157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /*Y*/ 18257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay if (usage_mask & TGSI_WRITEMASK_Y) { 18357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.a0[slot][1] = 0.0; 18457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.dadx[slot][1] = 0.0; 18557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.dady[slot][1] = 1.0; 18657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 18757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 18857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /*Z*/ 18957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay if (usage_mask & TGSI_WRITEMASK_Z) { 19057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay constant_coef(setup, point, slot, info->v0[0][2], 2); 19157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 19257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 19357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /*W*/ 19457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay if (usage_mask & TGSI_WRITEMASK_W) { 19557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay constant_coef(setup, point, slot, info->v0[0][3], 3); 19657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 19757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay} 19857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 199924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul 20057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay/** 20157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Compute the point->coef[] array dadx, dady, a0 values. 20257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 20357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystatic void 20457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taysetup_point_coefficients( struct lp_setup_context *setup, 20557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay struct lp_rast_triangle *point, 20657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay const struct point_info *info) 20757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{ 208b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul const struct lp_fragment_shader *shader = setup->fs.current.variant->shader; 20957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned fragcoord_usage_mask = TGSI_WRITEMASK_XYZ; 21057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned slot; 21157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 21257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* setup interpolation for all the remaining attributes: 21357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 21457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay for (slot = 0; slot < setup->fs.nr_inputs; slot++) { 215e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca enum lp_interp interp = setup->fs.input[slot].interp; 216e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca boolean perspective = !!(interp == LP_INTERP_PERSPECTIVE); 21757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned vert_attr = setup->fs.input[slot].src_index; 21857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned usage_mask = setup->fs.input[slot].usage_mask; 21957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned i; 220e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca 221e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca if (perspective & usage_mask) { 222e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca fragcoord_usage_mask |= TGSI_WRITEMASK_W; 223e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca } 22457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 225e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca switch (interp) { 22657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay case LP_INTERP_POSITION: 22757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* 22857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * The generated pixel interpolators will pick up the coeffs from 22957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * slot 0, so all need to ensure that the usage mask is covers all 23057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * usages. 23157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 23257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay fragcoord_usage_mask |= usage_mask; 23357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay break; 23457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 235b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul case LP_INTERP_LINEAR: 236b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul /* Sprite tex coords may use linear interpolation someday */ 237b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul /* fall-through */ 23829ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay case LP_INTERP_PERSPECTIVE: 239b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul /* check if the sprite coord flag is set for this attribute. 240516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * If so, set it up so it up so x and y vary from 0 to 1. 241b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul */ 242986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca if (shader->info.base.input_semantic_name[slot] == TGSI_SEMANTIC_GENERIC) { 243986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca unsigned semantic_index = shader->info.base.input_semantic_index[slot]; 2441662c317032cf280701d7e55b028b7f0dc8afc65Brian Paul /* Note that sprite_coord enable is a bitfield of 2451662c317032cf280701d7e55b028b7f0dc8afc65Brian Paul * PIPE_MAX_SHADER_OUTPUTS bits. 2461662c317032cf280701d7e55b028b7f0dc8afc65Brian Paul */ 247e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca if (semantic_index < PIPE_MAX_SHADER_OUTPUTS && 248e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca (setup->sprite_coord_enable & (1 << semantic_index))) { 249e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca for (i = 0; i < NUM_CHANNELS; i++) { 250e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca if (usage_mask & (1 << i)) { 251516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul texcoord_coef(setup, point, info, slot + 1, i, 252516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul setup->sprite_coord_origin, 253e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca perspective); 254e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca } 255e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca } 256e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca break; 25729ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay } 25829ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay } 259e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca /* fall-through */ 26060a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell case LP_INTERP_CONSTANT: 26157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay for (i = 0; i < NUM_CHANNELS; i++) { 262e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca if (usage_mask & (1 << i)) { 263e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca if (perspective) { 264e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca point_persp_coeff(setup, point, info, slot+1, i); 265e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca } 266e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca else { 267e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca constant_coef(setup, point, slot+1, info->v0[vert_attr][i], i); 268e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca } 269e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca } 27057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 27160a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell break; 27260a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell 27360a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell case LP_INTERP_FACING: 27460a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell for (i = 0; i < NUM_CHANNELS; i++) 27560a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell if (usage_mask & (1 << i)) 27660a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell constant_coef(setup, point, slot+1, 1.0, i); 27760a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell break; 27860a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell 27960a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell default: 28060a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell assert(0); 28160a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell break; 28257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 28357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 28457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 28557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* The internal position input is in slot zero: 28657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 28757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay setup_point_fragcoord_coef(setup, point, info, 0, 28857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay fragcoord_usage_mask); 28957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay} 29057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 291924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul 29257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystatic INLINE int 29357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taysubpixel_snap(float a) 29457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{ 29557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay return util_iround(FIXED_ONE * a); 29657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay} 29757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 298415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 2996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean 3006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelltry_setup_point( struct lp_setup_context *setup, 3016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell const float (*v0)[4] ) 302415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 30357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* x/y positions in fixed point */ 30457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay const int sizeAttr = setup->psize; 30557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay const float size 30629ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay = (setup->point_size_per_vertex && sizeAttr > 0) ? v0[sizeAttr][0] 30757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay : setup->point_size; 3082cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay 3092cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay /* Point size as fixed point integer, remove rounding errors 3102cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay * and gives minimum width for very small points 3112cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay */ 3122cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay int fixed_width = MAX2(FIXED_ONE, 3132cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay (subpixel_snap(size) + FIXED_ONE/2 - 1) & ~(FIXED_ONE-1)); 3142cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay 3152cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay const int x0 = subpixel_snap(v0[0][0] - setup->pixel_offset) - fixed_width/2; 3162cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay const int y0 = subpixel_snap(v0[0][1] - setup->pixel_offset) - fixed_width/2; 3172cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay 3189f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 31957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay struct lp_rast_triangle *point; 32057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned bytes; 32157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay struct u_rect bbox; 32257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay unsigned nr_planes = 4; 32357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay struct point_info info; 32457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 32557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 32657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* Bounding rectangle (in pixels) */ 32757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay { 32857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* Yes this is necessary to accurately calculate bounding boxes 32957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * with the two fill-conventions we support. GL (normally) ends 33057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * up needing a bottom-left fill convention, which requires 33157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * slightly different rounding. 33257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 33357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay int adj = (setup->pixel_offset != 0) ? 1 : 0; 33457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 3352cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay bbox.x0 = (x0 + (FIXED_ONE-1) + adj) >> FIXED_ORDER; 3362cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay bbox.x1 = (x0 + fixed_width + (FIXED_ONE-1) + adj) >> FIXED_ORDER; 3372cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay bbox.y0 = (y0 + (FIXED_ONE-1)) >> FIXED_ORDER; 3382cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay bbox.y1 = (y0 + fixed_width + (FIXED_ONE-1)) >> FIXED_ORDER; 33957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 34057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* Inclusive coordinates: 34157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 34257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay bbox.x1--; 34357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay bbox.y1--; 34457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 34557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 34657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay if (!u_rect_test_intersection(&setup->draw_region, &bbox)) { 34757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay if (0) debug_printf("offscreen\n"); 34857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay LP_COUNT(nr_culled_tris); 3496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return TRUE; 35057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 35157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 35257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay u_rect_find_intersection(&setup->draw_region, &bbox); 35357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 35457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point = lp_setup_alloc_triangle(scene, 35557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay setup->fs.nr_inputs, 35657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay nr_planes, 35757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay &bytes); 35857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay if (!point) 3596419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 36057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 36157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#ifdef DEBUG 36257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->v[0][0] = v0[0][0]; 36357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->v[0][1] = v0[0][1]; 36457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#endif 36557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 36657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay info.v0 = v0; 3672cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay info.dx01 = 0; 3682cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay info.dx12 = fixed_width; 3692cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay info.dy01 = fixed_width; 3702cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay info.dy12 = 0; 37157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 37257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay /* Setup parameter interpolants: 37357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */ 37457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay setup_point_coefficients(setup, point, &info); 37557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 37657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.facing = 1.0F; 37757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->inputs.state = setup->fs.stored; 3789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell point->inputs.disable = FALSE; 3799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell point->inputs.opaque = FALSE; 38057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 38157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay { 38257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[0].dcdx = -1; 38357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[0].dcdy = 0; 38457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[0].c = 1-bbox.x0; 38557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[0].ei = 0; 38657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[0].eo = 1; 38757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 38857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[1].dcdx = 1; 38957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[1].dcdy = 0; 39057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[1].c = bbox.x1+1; 39157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[1].ei = -1; 39257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[1].eo = 0; 39357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 39457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[2].dcdx = 0; 39557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[2].dcdy = 1; 39657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[2].c = 1-bbox.y0; 39757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[2].ei = 0; 39857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[2].eo = 1; 39957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 40057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[3].dcdx = 0; 40157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[3].dcdy = -1; 40257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[3].c = bbox.y1+1; 40357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[3].ei = -1; 40457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay point->plane[3].eo = 0; 40557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay } 40657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 4076419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return lp_setup_bin_triangle(setup, point, &bbox, nr_planes); 4086419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 4096419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 4106419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 411924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulstatic void 412924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paullp_setup_point(struct lp_setup_context *setup, 413924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul const float (*v0)[4]) 4146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{ 4156419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!try_setup_point( setup, v0 )) 4166419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell { 417ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!lp_setup_flush_and_restart(setup)) 418ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return; 4196419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 4206419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!try_setup_point( setup, v0 )) 421ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return; 4226419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 423415b271b5100d64579690111bc8eb549866865a7Keith Whitwell} 424415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 425415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 426415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 4273160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_choose_point( struct lp_setup_context *setup ) 428415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 4295286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay setup->point = lp_setup_point; 430415b271b5100d64579690111bc8eb549866865a7Keith Whitwell} 431415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 432415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 433