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