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"
385b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell#include "lp_state_setup.h"
3929ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay#include "tgsi/tgsi_scan.h"
4057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
4157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#define NUM_CHANNELS 4
4257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
4357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystruct point_info {
4457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /* x,y deltas */
4557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   int dy01, dy12;
4657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   int dx01, dx12;
4757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
4857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   const float (*v0)[4];
499bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell
509bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   float (*a0)[4];
519bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   float (*dadx)[4];
529bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   float (*dady)[4];
5357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay};
5457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
5557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
5657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay/**
5757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Compute a0 for a constant-valued coefficient (GL_FLAT shading).
5857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */
59924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulstatic void
60924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulconstant_coef(struct lp_setup_context *setup,
619bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell              struct point_info *info,
62924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul              unsigned slot,
63924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul              const float value,
64924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul              unsigned i)
6557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{
669bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info->a0[slot][i] = value;
679bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info->dadx[slot][i] = 0.0f;
689bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info->dady[slot][i] = 0.0f;
6957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}
7057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
71924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul
72e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonsecastatic void
73e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonsecapoint_persp_coeff(struct lp_setup_context *setup,
74e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca                  const struct point_info *info,
75e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca                  unsigned slot,
76e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca                  unsigned i)
7729ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay{
78e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca   /*
79e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca    * Fragment shader expects pre-multiplied w for LP_INTERP_PERSPECTIVE. A
80e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca    * better stratergy would be to take the primitive in consideration when
81e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca    * generating the fragment shader key, and therefore avoid the per-fragment
82e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca    * perspective divide.
83e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca    */
84e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca
85e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca   float w0 = info->v0[0][3];
86e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca
87e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca   assert(i < 4);
88e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca
899bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info->a0[slot][i] = info->v0[slot][i]*w0;
909bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info->dadx[slot][i] = 0.0f;
919bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info->dady[slot][i] = 0.0f;
92e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca}
93e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca
94e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca
95516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul/**
96516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * Setup automatic texcoord coefficients (for sprite rendering).
97516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * \param slot  the vertex attribute slot to setup
98516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * \param i  the attribute channel in [0,3]
99516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul * \param sprite_coord_origin  one of PIPE_SPRITE_COORD_x
100e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca * \param perspective  does the shader expects pre-multiplied w, i.e.,
101e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca *    LP_INTERP_PERSPECTIVE is specified in the shader key
102516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul */
103924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulstatic void
104516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paultexcoord_coef(struct lp_setup_context *setup,
105516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul              const struct point_info *info,
106516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul              unsigned slot,
107516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul              unsigned i,
108516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul              unsigned sprite_coord_origin,
109e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca              boolean perspective)
11029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay{
11106472ad7e835813ef7c9bf8a5cd8b62a25fa9cc3José Fonseca   float w0 = info->v0[0][3];
11206472ad7e835813ef7c9bf8a5cd8b62a25fa9cc3José Fonseca
113516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul   assert(i < 4);
114516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul
115924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul   if (i == 0) {
116924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul      float dadx = FIXED_ONE / (float)info->dx12;
11729ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay      float dady =  0.0f;
118516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul      float x0 = info->v0[0][0] - setup->pixel_offset;
119516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul      float y0 = info->v0[0][1] - setup->pixel_offset;
12029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay
1219bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dadx[slot][0] = dadx;
1229bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dady[slot][0] = dady;
1239bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->a0[slot][0] = 0.5 - (dadx * x0 + dady * y0);
124516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul
125e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca      if (perspective) {
1269bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell         info->dadx[slot][0] *= w0;
1279bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell         info->dady[slot][0] *= w0;
1289bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell         info->a0[slot][0] *= w0;
129516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul      }
13029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   }
13129ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   else if (i == 1) {
13261fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul      float dadx = 0.0f;
13361fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul      float dady = FIXED_ONE / (float)info->dx12;
134516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul      float x0 = info->v0[0][0] - setup->pixel_offset;
135516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul      float y0 = info->v0[0][1] - setup->pixel_offset;
13629ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay
13761fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul      if (sprite_coord_origin == PIPE_SPRITE_COORD_LOWER_LEFT) {
13861fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul         dady = -dady;
13961fcd9aaa2bf91eb400eeb4df2ab2c7e48b3bb6cBrian Paul      }
140924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul
1419bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dadx[slot][1] = dadx;
1429bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dady[slot][1] = dady;
1439bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->a0[slot][1] = 0.5 - (dadx * x0 + dady * y0);
144516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul
145e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca      if (perspective) {
1469bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell         info->dadx[slot][1] *= w0;
1479bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell         info->dady[slot][1] *= w0;
1489bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell         info->a0[slot][1] *= w0;
149516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul      }
15029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   }
15129ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   else if (i == 2) {
1529bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->a0[slot][2] = 0.0f;
1539bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dadx[slot][2] = 0.0f;
1549bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dady[slot][2] = 0.0f;
15529ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   }
156516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul   else {
1579bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->a0[slot][3] = perspective ? w0 : 1.0f;
1589bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dadx[slot][3] = 0.0f;
1599bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dady[slot][3] = 0.0f;
16029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   }
16129ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay}
16229ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay
16329ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay
16457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay/**
16557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Special coefficient setup for gl_FragCoord.
16657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * X and Y are trivial
16757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Z and W are copied from position_coef which should have already been computed.
16857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * We could do a bit less work if we'd examine gl_FragCoord's swizzle mask.
16957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */
17057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystatic void
17157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taysetup_point_fragcoord_coef(struct lp_setup_context *setup,
1729bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell                           struct point_info *info,
17357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay                           unsigned slot,
17457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay                           unsigned usage_mask)
17557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{
17657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /*X*/
17757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   if (usage_mask & TGSI_WRITEMASK_X) {
1789bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->a0[slot][0] = 0.0;
1799bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dadx[slot][0] = 1.0;
1809bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dady[slot][0] = 0.0;
18157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
18257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
18357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /*Y*/
18457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   if (usage_mask & TGSI_WRITEMASK_Y) {
1859bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->a0[slot][1] = 0.0;
1869bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dadx[slot][1] = 0.0;
1879bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      info->dady[slot][1] = 1.0;
18857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
18957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
19057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /*Z*/
19157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   if (usage_mask & TGSI_WRITEMASK_Z) {
1929bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      constant_coef(setup, info, slot, info->v0[0][2], 2);
19357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
19457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
19557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /*W*/
19657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   if (usage_mask & TGSI_WRITEMASK_W) {
1979bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      constant_coef(setup, info, slot, info->v0[0][3], 3);
19857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
19957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}
20057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
201924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul
20257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay/**
20357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay * Compute the point->coef[] array dadx, dady, a0 values.
20457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay */
20557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystatic void
20657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taysetup_point_coefficients( struct lp_setup_context *setup,
2079bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell                          struct point_info *info)
20857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{
2095b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   const struct lp_setup_variant_key *key = &setup->setup.variant->key;
210b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul   const struct lp_fragment_shader *shader = setup->fs.current.variant->shader;
21157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   unsigned fragcoord_usage_mask = TGSI_WRITEMASK_XYZ;
21257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   unsigned slot;
21357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
21457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /* setup interpolation for all the remaining attributes:
21557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay    */
2165b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   for (slot = 0; slot < key->num_inputs; slot++) {
2175b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      unsigned vert_attr = key->inputs[slot].src_index;
2185b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      unsigned usage_mask = key->inputs[slot].usage_mask;
2190072acd447dc6be652e63752e50215c3105322c8Keith Whitwell      enum lp_interp interp = key->inputs[slot].interp;
220e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca      boolean perspective = !!(interp == LP_INTERP_PERSPECTIVE);
22157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      unsigned i;
222e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca
223e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca      if (perspective & usage_mask) {
224e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca         fragcoord_usage_mask |= TGSI_WRITEMASK_W;
225e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca      }
22657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
227e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca      switch (interp) {
22857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      case LP_INTERP_POSITION:
22957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay         /*
23057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay          * The generated pixel interpolators will pick up the coeffs from
23157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay          * slot 0, so all need to ensure that the usage mask is covers all
23257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay          * usages.
23357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay          */
23457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay         fragcoord_usage_mask |= usage_mask;
23557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay         break;
23657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
237b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul      case LP_INTERP_LINEAR:
238b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul         /* Sprite tex coords may use linear interpolation someday */
239b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul         /* fall-through */
24029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay      case LP_INTERP_PERSPECTIVE:
241b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul         /* check if the sprite coord flag is set for this attribute.
242516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul          * If so, set it up so it up so x and y vary from 0 to 1.
243b7a5eac1f3723a369885bad369a04c456bdf1565Brian Paul          */
244986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca         if (shader->info.base.input_semantic_name[slot] == TGSI_SEMANTIC_GENERIC) {
245986cb9d5cf60bc11c7facc19017b5432b17240f7José Fonseca            unsigned semantic_index = shader->info.base.input_semantic_index[slot];
2461662c317032cf280701d7e55b028b7f0dc8afc65Brian Paul            /* Note that sprite_coord enable is a bitfield of
2471662c317032cf280701d7e55b028b7f0dc8afc65Brian Paul             * PIPE_MAX_SHADER_OUTPUTS bits.
2481662c317032cf280701d7e55b028b7f0dc8afc65Brian Paul             */
249e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca            if (semantic_index < PIPE_MAX_SHADER_OUTPUTS &&
250e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca                (setup->sprite_coord_enable & (1 << semantic_index))) {
251e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca               for (i = 0; i < NUM_CHANNELS; i++) {
252e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca                  if (usage_mask & (1 << i)) {
2539bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell                     texcoord_coef(setup, info, slot + 1, i,
254516ac2bd50ad1e71bd2a359d247532d9f18bcf99Brian Paul                                   setup->sprite_coord_origin,
255e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca                                   perspective);
256e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca                  }
257e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca               }
258e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca               break;
25929ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay            }
26029ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay         }
261e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca         /* fall-through */
26260a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell      case LP_INTERP_CONSTANT:
26357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay         for (i = 0; i < NUM_CHANNELS; i++) {
264e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca            if (usage_mask & (1 << i)) {
265e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca               if (perspective) {
2669bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell                  point_persp_coeff(setup, info, slot+1, i);
267e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca               }
268e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca               else {
2699bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell                  constant_coef(setup, info, slot+1, info->v0[vert_attr][i], i);
270e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca               }
271e74955eba3fc22fcf6e9111a4e5bbc095d34d357José Fonseca            }
27257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay         }
27360a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell         break;
27460a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell
27560a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell      case LP_INTERP_FACING:
27660a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell         for (i = 0; i < NUM_CHANNELS; i++)
27760a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell            if (usage_mask & (1 << i))
2789bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell               constant_coef(setup, info, slot+1, 1.0, i);
27960a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell         break;
28060a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell
28160a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell      default:
28260a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell         assert(0);
28360a45b03c389f708c513bb2b70c5973175f01068Keith Whitwell         break;
28457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      }
28557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
28657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
28757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /* The internal position input is in slot zero:
28857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay    */
2899bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   setup_point_fragcoord_coef(setup, info, 0,
29057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay                              fragcoord_usage_mask);
29157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}
29257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
293924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul
29457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taystatic INLINE int
29557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taysubpixel_snap(float a)
29657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{
29757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   return util_iround(FIXED_ONE * a);
29857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}
29957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
300415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
3016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean
3026419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelltry_setup_point( struct lp_setup_context *setup,
3036419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                 const float (*v0)[4] )
304415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{
30557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /* x/y positions in fixed point */
3065b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   const struct lp_setup_variant_key *key = &setup->setup.variant->key;
30757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   const int sizeAttr = setup->psize;
30857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   const float size
30929ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay      = (setup->point_size_per_vertex && sizeAttr > 0) ? v0[sizeAttr][0]
31057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      : setup->point_size;
3112cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay
3122cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   /* Point size as fixed point integer, remove rounding errors
3132cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay    * and gives minimum width for very small points
3142cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay    */
3152cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   int fixed_width = MAX2(FIXED_ONE,
3162cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay                          (subpixel_snap(size) + FIXED_ONE/2 - 1) & ~(FIXED_ONE-1));
3172cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay
3182cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   const int x0 = subpixel_snap(v0[0][0] - setup->pixel_offset) - fixed_width/2;
3192cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   const int y0 = subpixel_snap(v0[0][1] - setup->pixel_offset) - fixed_width/2;
3202cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay
3219f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
32257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   struct lp_rast_triangle *point;
32357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   unsigned bytes;
32457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   struct u_rect bbox;
32557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   unsigned nr_planes = 4;
32657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   struct point_info info;
32757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
32857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
32957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /* Bounding rectangle (in pixels) */
33057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   {
33157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      /* Yes this is necessary to accurately calculate bounding boxes
33257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay       * with the two fill-conventions we support.  GL (normally) ends
33357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay       * up needing a bottom-left fill convention, which requires
33457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay       * slightly different rounding.
33557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay       */
33657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      int adj = (setup->pixel_offset != 0) ? 1 : 0;
33757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
3382cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay      bbox.x0 = (x0 + (FIXED_ONE-1) + adj) >> FIXED_ORDER;
3392cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay      bbox.x1 = (x0 + fixed_width + (FIXED_ONE-1) + adj) >> FIXED_ORDER;
3402cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay      bbox.y0 = (y0 + (FIXED_ONE-1)) >> FIXED_ORDER;
3412cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay      bbox.y1 = (y0 + fixed_width + (FIXED_ONE-1)) >> FIXED_ORDER;
34257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
34357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      /* Inclusive coordinates:
34457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay       */
34557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      bbox.x1--;
34657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      bbox.y1--;
34757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
34857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
34957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   if (!u_rect_test_intersection(&setup->draw_region, &bbox)) {
35057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      if (0) debug_printf("offscreen\n");
35157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay      LP_COUNT(nr_culled_tris);
3526419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      return TRUE;
35357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
35457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
35557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   u_rect_find_intersection(&setup->draw_region, &bbox);
35657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
35757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   point = lp_setup_alloc_triangle(scene,
3585b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell                                   key->num_inputs,
35957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay                                   nr_planes,
36057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay                                   &bytes);
36157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   if (!point)
3626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      return FALSE;
36357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
36457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#ifdef DEBUG
36557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   point->v[0][0] = v0[0][0];
36657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   point->v[0][1] = v0[0][1];
36757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay#endif
36857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
36957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   info.v0 = v0;
3702cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   info.dx01 = 0;
3712cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   info.dx12 = fixed_width;
3722cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   info.dy01 = fixed_width;
3732cd72dd4590b4510931854ed776c72563603f7ffHui Qi Tay   info.dy12 = 0;
3749bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info.a0 = GET_A0(&point->inputs);
3759bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info.dadx = GET_DADX(&point->inputs);
3769bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   info.dady = GET_DADY(&point->inputs);
37757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
37857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   /* Setup parameter interpolants:
37957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay    */
3809bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   setup_point_coefficients(setup, &info);
38157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
3820a1c9001037a13b69b157994e7983aa3dee158d3Keith Whitwell   point->inputs.frontfacing = TRUE;
3839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   point->inputs.disable = FALSE;
3849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   point->inputs.opaque = FALSE;
38557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
38657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   {
3879bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      struct lp_rast_plane *plane = GET_PLANES(point);
3889bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell
3899bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[0].dcdx = -1;
3909bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[0].dcdy = 0;
3919bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[0].c = 1-bbox.x0;
3929bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[0].eo = 1;
3939bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell
3949bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[1].dcdx = 1;
3959bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[1].dcdy = 0;
3969bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[1].c = bbox.x1+1;
3979bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[1].eo = 0;
3989bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell
3999bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[2].dcdx = 0;
4009bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[2].dcdy = 1;
4019bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[2].c = 1-bbox.y0;
4029bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[2].eo = 1;
4039bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell
4049bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[3].dcdx = 0;
4059bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[3].dcdy = -1;
4069bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[3].c = bbox.y1+1;
4079bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[3].eo = 0;
40857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   }
40957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
4106419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   return lp_setup_bin_triangle(setup, point, &bbox, nr_planes);
4116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
4126419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
4136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
414924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paulstatic void
415924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paullp_setup_point(struct lp_setup_context *setup,
416924c18da95bbc62492f8e54bd8273a4981a919dcBrian Paul               const float (*v0)[4])
4176419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{
4186419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   if (!try_setup_point( setup, v0 ))
4196419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   {
420ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!lp_setup_flush_and_restart(setup))
421ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return;
4226419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
4236419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (!try_setup_point( setup, v0 ))
424ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return;
4256419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   }
426415b271b5100d64579690111bc8eb549866865a7Keith Whitwell}
427415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
428415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
429415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid
4303160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_choose_point( struct lp_setup_context *setup )
431415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{
4325286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay   setup->point = lp_setup_point;
433415b271b5100d64579690111bc8eb549866865a7Keith Whitwell}
434415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
435415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
436