1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010, VMware Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Binning code for points 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_setup_context.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_perf.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_rast.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_state_fs.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_state_setup.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_scan.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUM_CHANNELS 4 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct point_info { 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* x,y deltas */ 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dy01, dy12; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dx01, dx12; 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float (*v0)[4]; 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*a0)[4]; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*dadx)[4]; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float (*dady)[4]; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute a0 for a constant-valued coefficient (GL_FLAT shading). 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconstant_coef(struct lp_setup_context *setup, 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct point_info *info, 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned slot, 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float value, 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][i] = value; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][i] = 0.0f; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][i] = 0.0f; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpoint_persp_coeff(struct lp_setup_context *setup, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct point_info *info, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned slot, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fragment shader expects pre-multiplied w for LP_INTERP_PERSPECTIVE. A 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * better stratergy would be to take the primitive in consideration when 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * generating the fragment shader key, and therefore avoid the per-fragment 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * perspective divide. 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float w0 = info->v0[0][3]; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i < 4); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][i] = info->v0[slot][i]*w0; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][i] = 0.0f; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][i] = 0.0f; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Setup automatic texcoord coefficients (for sprite rendering). 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param slot the vertex attribute slot to setup 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param i the attribute channel in [0,3] 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param sprite_coord_origin one of PIPE_SPRITE_COORD_x 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param perspective does the shader expects pre-multiplied w, i.e., 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LP_INTERP_PERSPECTIVE is specified in the shader key 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtexcoord_coef(struct lp_setup_context *setup, 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct point_info *info, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned slot, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sprite_coord_origin, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean perspective) 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float w0 = info->v0[0][3]; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i < 4); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 0) { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float dadx = FIXED_ONE / (float)info->dx12; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float dady = 0.0f; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float x0 = info->v0[0][0] - setup->pixel_offset; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float y0 = info->v0[0][1] - setup->pixel_offset; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][0] = dadx; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][0] = dady; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][0] = 0.5 - (dadx * x0 + dady * y0); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (perspective) { 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][0] *= w0; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][0] *= w0; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][0] *= w0; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (i == 1) { 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float dadx = 0.0f; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float dady = FIXED_ONE / (float)info->dx12; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float x0 = info->v0[0][0] - setup->pixel_offset; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float y0 = info->v0[0][1] - setup->pixel_offset; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sprite_coord_origin == PIPE_SPRITE_COORD_LOWER_LEFT) { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dady = -dady; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][1] = dadx; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][1] = dady; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][1] = 0.5 - (dadx * x0 + dady * y0); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (perspective) { 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][1] *= w0; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][1] *= w0; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][1] *= w0; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (i == 2) { 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][2] = 0.0f; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][2] = 0.0f; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][2] = 0.0f; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][3] = perspective ? w0 : 1.0f; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][3] = 0.0f; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][3] = 0.0f; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special coefficient setup for gl_FragCoord. 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * X and Y are trivial 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Z and W are copied from position_coef which should have already been computed. 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We could do a bit less work if we'd examine gl_FragCoord's swizzle mask. 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsetup_point_fragcoord_coef(struct lp_setup_context *setup, 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct point_info *info, 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned slot, 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage_mask) 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*X*/ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage_mask & TGSI_WRITEMASK_X) { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][0] = 0.0; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][0] = 1.0; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][0] = 0.0; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*Y*/ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage_mask & TGSI_WRITEMASK_Y) { 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->a0[slot][1] = 0.0; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dadx[slot][1] = 0.0; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->dady[slot][1] = 1.0; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*Z*/ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage_mask & TGSI_WRITEMASK_Z) { 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constant_coef(setup, info, slot, info->v0[0][2], 2); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*W*/ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage_mask & TGSI_WRITEMASK_W) { 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constant_coef(setup, info, slot, info->v0[0][3], 3); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute the point->coef[] array dadx, dady, a0 values. 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsetup_point_coefficients( struct lp_setup_context *setup, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct point_info *info) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_setup_variant_key *key = &setup->setup.variant->key; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_fragment_shader *shader = setup->fs.current.variant->shader; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned fragcoord_usage_mask = TGSI_WRITEMASK_XYZ; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned slot; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* setup interpolation for all the remaining attributes: 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (slot = 0; slot < key->num_inputs; slot++) { 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned vert_attr = key->inputs[slot].src_index; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage_mask = key->inputs[slot].usage_mask; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum lp_interp interp = key->inputs[slot].interp; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean perspective = !!(interp == LP_INTERP_PERSPECTIVE); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (perspective & usage_mask) { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragcoord_usage_mask |= TGSI_WRITEMASK_W; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (interp) { 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case LP_INTERP_POSITION: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The generated pixel interpolators will pick up the coeffs from 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * slot 0, so all need to ensure that the usage mask is covers all 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * usages. 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragcoord_usage_mask |= usage_mask; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case LP_INTERP_LINEAR: 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sprite tex coords may use linear interpolation someday */ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case LP_INTERP_PERSPECTIVE: 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check if the sprite coord flag is set for this attribute. 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If so, set it up so it up so x and y vary from 0 to 1. 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shader->info.base.input_semantic_name[slot] == TGSI_SEMANTIC_GENERIC) { 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned semantic_index = shader->info.base.input_semantic_index[slot]; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note that sprite_coord enable is a bitfield of 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PIPE_MAX_SHADER_OUTPUTS bits. 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (semantic_index < PIPE_MAX_SHADER_OUTPUTS && 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (setup->sprite_coord_enable & (1 << semantic_index))) { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NUM_CHANNELS; i++) { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage_mask & (1 << i)) { 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord_coef(setup, info, slot + 1, i, 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup->sprite_coord_origin, 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org perspective); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case LP_INTERP_CONSTANT: 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NUM_CHANNELS; i++) { 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage_mask & (1 << i)) { 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (perspective) { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point_persp_coeff(setup, info, slot+1, i); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constant_coef(setup, info, slot+1, info->v0[vert_attr][i], i); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case LP_INTERP_FACING: 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < NUM_CHANNELS; i++) 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (usage_mask & (1 << i)) 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org constant_coef(setup, info, slot+1, 1.0, i); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The internal position input is in slot zero: 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup_point_fragcoord_coef(setup, info, 0, 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragcoord_usage_mask); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsubpixel_snap(float a) 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_iround(FIXED_ONE * a); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtry_setup_point( struct lp_setup_context *setup, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float (*v0)[4] ) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* x/y positions in fixed point */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_setup_variant_key *key = &setup->setup.variant->key; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int sizeAttr = setup->psize; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float size 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (setup->point_size_per_vertex && sizeAttr > 0) ? v0[sizeAttr][0] 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : setup->point_size; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Point size as fixed point integer, remove rounding errors 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and gives minimum width for very small points 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int fixed_width = MAX2(FIXED_ONE, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (subpixel_snap(size) + FIXED_ONE/2 - 1) & ~(FIXED_ONE-1)); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int x0 = subpixel_snap(v0[0][0] - setup->pixel_offset) - fixed_width/2; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int y0 = subpixel_snap(v0[0][1] - setup->pixel_offset) - fixed_width/2; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_scene *scene = setup->scene; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_rast_triangle *point; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bytes; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct u_rect bbox; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_planes = 4; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct point_info info; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Bounding rectangle (in pixels) */ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Yes this is necessary to accurately calculate bounding boxes 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with the two fill-conventions we support. GL (normally) ends 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * up needing a bottom-left fill convention, which requires 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * slightly different rounding. 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int adj = (setup->pixel_offset != 0) ? 1 : 0; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbox.x0 = (x0 + (FIXED_ONE-1) + adj) >> FIXED_ORDER; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbox.x1 = (x0 + fixed_width + (FIXED_ONE-1) + adj) >> FIXED_ORDER; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbox.y0 = (y0 + (FIXED_ONE-1)) >> FIXED_ORDER; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbox.y1 = (y0 + fixed_width + (FIXED_ONE-1)) >> FIXED_ORDER; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Inclusive coordinates: 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbox.x1--; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbox.y1--; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!u_rect_test_intersection(&setup->draw_region, &bbox)) { 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) debug_printf("offscreen\n"); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_COUNT(nr_culled_tris); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_rect_find_intersection(&setup->draw_region, &bbox); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point = lp_setup_alloc_triangle(scene, 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->num_inputs, 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nr_planes, 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &bytes); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!point) 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point->v[0][0] = v0[0][0]; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point->v[0][1] = v0[0][1]; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.v0 = v0; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.dx01 = 0; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.dx12 = fixed_width; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.dy01 = fixed_width; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.dy12 = 0; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.a0 = GET_A0(&point->inputs); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.dadx = GET_DADX(&point->inputs); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.dady = GET_DADY(&point->inputs); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup parameter interpolants: 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup_point_coefficients(setup, &info); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point->inputs.frontfacing = TRUE; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point->inputs.disable = FALSE; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point->inputs.opaque = FALSE; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_rast_plane *plane = GET_PLANES(point); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[0].dcdx = -1; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[0].dcdy = 0; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[0].c = 1-bbox.x0; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[0].eo = 1; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[1].dcdx = 1; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[1].dcdy = 0; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[1].c = bbox.x1+1; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[1].eo = 0; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[2].dcdx = 0; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[2].dcdy = 1; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[2].c = 1-bbox.y0; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[2].eo = 1; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[3].dcdx = 0; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[3].dcdy = -1; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[3].c = bbox.y1+1; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plane[3].eo = 0; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lp_setup_bin_triangle(setup, point, &bbox, nr_planes); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_setup_point(struct lp_setup_context *setup, 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float (*v0)[4]) 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!try_setup_point( setup, v0 )) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!lp_setup_flush_and_restart(setup)) 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!try_setup_point( setup, v0 )) 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_setup_choose_point( struct lp_setup_context *setup ) 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setup->point = lp_setup_point; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436