1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.1 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_context.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_feedback.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_points.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_span.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used to cull points with invalid coords 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CULL_INVALID(V) \ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float tmp = (V)->attrib[FRAG_ATTRIB_WPOS][0] \ 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org + (V)->attrib[FRAG_ATTRIB_WPOS][1]; \ 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (IS_INF_OR_NAN(tmp)) \ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; \ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while(0) 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get/compute the point size. 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The size may come from a vertex shader, or computed with attentuation 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or just the glPointSize value. 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Must also clamp to user-defined range and implmentation limits. 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLfloat 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_size(const struct gl_context *ctx, const SWvertex *vert, GLboolean smoothed) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat size; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point._Attenuated || ctx->VertexProgram.PointSizeEnabled) { 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use vertex's point size */ 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = vert->pointSize; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use constant point size */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = ctx->Point.Size; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* always clamp to user-specified limits */ 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = CLAMP(size, ctx->Point.MinSize, ctx->Point.MaxSize); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to implementation limits */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (smoothed) 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = CLAMP(size, ctx->Const.MinPointSizeAA, ctx->Const.MaxPointSizeAA); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = CLAMP(size, ctx->Const.MinPointSize, ctx->Const.MaxPointSize); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return size; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw a point sprite 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsprite_point(struct gl_context *ctx, const SWvertex *vert) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWspan span; 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat size; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint tCoords[MAX_TEXTURE_COORD_UNITS + 1]; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint numTcoords = 0; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat t0, dtdy; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CULL_INVALID(vert); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* z coord */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->DrawBuffer->Visual.depthBits <= 16) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z = FloatToFixed(vert->attrib[FRAG_ATTRIB_WPOS][2] + 0.5F); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z = (GLuint) (vert->attrib[FRAG_ATTRIB_WPOS][2] + 0.5F); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.zStep = 0; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = get_size(ctx, vert, GL_FALSE); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* span init */ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT_SPAN(span, GL_POINT); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.interpMask = SPAN_Z | SPAN_RGBA; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.facing = swrast->PointLineFacing; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.red = ChanToFixed(vert->color[0]); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.green = ChanToFixed(vert->color[1]); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.blue = ChanToFixed(vert->color[2]); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.alpha = ChanToFixed(vert->color[3]); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.redStep = 0; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.greenStep = 0; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.blueStep = 0; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.alphaStep = 0; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need these for fragment programs */ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[FRAG_ATTRIB_WPOS][3] = 1.0F; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[FRAG_ATTRIB_WPOS][3] = 0.0F; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[FRAG_ATTRIB_WPOS][3] = 0.0F; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat s, r, dsdx; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* texcoord / pointcoord interpolants */ 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = 0.0F; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dsdx = 1.0F / size; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.SpriteOrigin == GL_LOWER_LEFT) { 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dtdy = 1.0F / size; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t0 = 0.5F * dtdy; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_UPPER_LEFT */ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dtdy = -1.0F / size; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t0 = 1.0F + 0.5F * dtdy; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_BEGIN 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (attr >= FRAG_ATTRIB_TEX0 && attr <= FRAG_ATTRIB_TEX7) { 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* a texcoord attribute */ 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint u = attr - FRAG_ATTRIB_TEX0; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(u < Elements(ctx->Point.CoordReplace)); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.CoordReplace[u]) { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tCoords[numTcoords++] = attr; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.SpriteRMode == GL_ZERO) 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = 0.0F; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Point.SpriteRMode == GL_S) 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = vert->attrib[attr][0]; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else /* GL_R */ 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = vert->attrib[attr][2]; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[attr][0] = s; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[attr][1] = 0.0; /* overwritten below */ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[attr][2] = r; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[attr][3] = 1.0; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[attr][0] = dsdx; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[attr][1] = 0.0; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[attr][2] = 0.0; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[attr][3] = 0.0; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[attr][0] = 0.0; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[attr][1] = dtdy; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[attr][2] = 0.0; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[attr][3] = 0.0; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (attr == FRAG_ATTRIB_PNTC) { 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GLSL gl_PointCoord.xy (.zw undefined) */ 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[FRAG_ATTRIB_PNTC][0] = 0.0; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[FRAG_ATTRIB_PNTC][1] = 0.0; /* t0 set below */ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[FRAG_ATTRIB_PNTC][0] = dsdx; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[FRAG_ATTRIB_PNTC][1] = 0.0; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[FRAG_ATTRIB_PNTC][0] = 0.0; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[FRAG_ATTRIB_PNTC][1] = dtdy; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tCoords[numTcoords++] = FRAG_ATTRIB_PNTC; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use vertex's texcoord/attrib */ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(span.attrStart[attr], vert->attrib[attr]); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(span.attrStepX[attr], 0, 0, 0, 0); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(span.attrStepY[attr], 0, 0, 0, 0); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_END; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute pos, bounds and render */ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat x = vert->attrib[FRAG_ATTRIB_WPOS][0]; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat y = vert->attrib[FRAG_ATTRIB_WPOS][1]; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint iSize = (GLint) (size + 0.5F); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xmin, xmax, ymin, ymax, iy; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint iRadius; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat tcoord = t0; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iSize = MAX2(1, iSize); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iRadius = iSize / 2; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iSize & 1) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* odd size */ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmin = (GLint) (x - iRadius); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmax = (GLint) (x + iRadius); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymin = (GLint) (y - iRadius); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymax = (GLint) (y + iRadius); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* even size */ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 0.501 factor allows conformance to pass */ 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmin = (GLint) (x + 0.501) - iRadius; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmax = xmin + iSize - 1; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymin = (GLint) (y + 0.501) - iRadius; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymax = ymin + iSize - 1; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* render spans */ 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (iy = ymin; iy <= ymax; iy++) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* setup texcoord T for this row */ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < numTcoords; i++) { 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[tCoords[i]][1] = tcoord; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* these might get changed by span clipping */ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.x = xmin; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.y = iy; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.end = xmax - xmin + 1; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, &span); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcoord += dtdy; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw smooth/antialiased point. RGB or CI mode. 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsmooth_point(struct gl_context *ctx, const SWvertex *vert) 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWspan span; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat size, alphaAtten; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CULL_INVALID(vert); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* z coord */ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->DrawBuffer->Visual.depthBits <= 16) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z = FloatToFixed(vert->attrib[FRAG_ATTRIB_WPOS][2] + 0.5F); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z = (GLuint) (vert->attrib[FRAG_ATTRIB_WPOS][2] + 0.5F); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.zStep = 0; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = get_size(ctx, vert, GL_TRUE); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* alpha attenuation / fade factor */ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Multisample._Enabled) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (vert->pointSize >= ctx->Point.Threshold) { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaAtten = 1.0F; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat dsize = vert->pointSize / ctx->Point.Threshold; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaAtten = dsize * dsize; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alphaAtten = 1.0; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) alphaAtten; /* not used */ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* span init */ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT_SPAN(span, GL_POINT); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.interpMask = SPAN_Z | SPAN_RGBA; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.arrayMask = SPAN_COVERAGE | SPAN_MASK; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.facing = swrast->PointLineFacing; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.red = ChanToFixed(vert->color[0]); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.green = ChanToFixed(vert->color[1]); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.blue = ChanToFixed(vert->color[2]); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.alpha = ChanToFixed(vert->color[3]); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.redStep = 0; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.greenStep = 0; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.blueStep = 0; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.alphaStep = 0; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need these for fragment programs */ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[FRAG_ATTRIB_WPOS][3] = 1.0F; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[FRAG_ATTRIB_WPOS][3] = 0.0F; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[FRAG_ATTRIB_WPOS][3] = 0.0F; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_BEGIN 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(span.attrStart[attr], vert->attrib[attr]); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(span.attrStepX[attr], 0, 0, 0, 0); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(span.attrStepY[attr], 0, 0, 0, 0); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_END 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute pos, bounds and render */ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat x = vert->attrib[FRAG_ATTRIB_WPOS][0]; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat y = vert->attrib[FRAG_ATTRIB_WPOS][1]; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat radius = 0.5F * size; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat rmin = radius - 0.7071F; /* 0.7071 = sqrt(2)/2 */ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat rmax = radius + 0.7071F; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat rmin2 = MAX2(0.0F, rmin * rmin); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat rmax2 = rmax * rmax; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat cscale = 1.0F / (rmax2 - rmin2); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint xmin = (GLint) (x - radius); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint xmax = (GLint) (x + radius); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint ymin = (GLint) (y - radius); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint ymax = (GLint) (y + radius); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint ix, iy; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (iy = ymin; iy <= ymax; iy++) { 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* these might get changed by span clipping */ 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.x = xmin; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.y = iy; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.end = xmax - xmin + 1; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute coverage for each pixel in span */ 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ix = xmin; ix <= xmax; ix++) { 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat dx = ix - x + 0.5F; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat dy = iy - y + 0.5F; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat dist2 = dx * dx + dy * dy; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat coverage; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dist2 < rmax2) { 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dist2 >= rmin2) { 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute partial coverage */ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coverage = 1.0F - (dist2 - rmin2) * cscale; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* full coverage */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coverage = 1.0F; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.array->mask[ix - xmin] = 1; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* zero coverage - fragment outside the radius */ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coverage = 0.0; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.array->mask[ix - xmin] = 0; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.array->coverage[ix - xmin] = coverage; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* render span */ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, &span); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw large (size >= 1) non-AA point. RGB or CI mode. 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglarge_point(struct gl_context *ctx, const SWvertex *vert) 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWspan span; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat size; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CULL_INVALID(vert); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* z coord */ 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->DrawBuffer->Visual.depthBits <= 16) 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z = FloatToFixed(vert->attrib[FRAG_ATTRIB_WPOS][2] + 0.5F); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.z = (GLuint) (vert->attrib[FRAG_ATTRIB_WPOS][2] + 0.5F); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.zStep = 0; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = get_size(ctx, vert, GL_FALSE); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* span init */ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INIT_SPAN(span, GL_POINT); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.arrayMask = SPAN_XY; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.facing = swrast->PointLineFacing; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.interpMask = SPAN_Z | SPAN_RGBA; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.red = ChanToFixed(vert->color[0]); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.green = ChanToFixed(vert->color[1]); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.blue = ChanToFixed(vert->color[2]); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.alpha = ChanToFixed(vert->color[3]); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.redStep = 0; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.greenStep = 0; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.blueStep = 0; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.alphaStep = 0; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need these for fragment programs */ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStart[FRAG_ATTRIB_WPOS][3] = 1.0F; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepX[FRAG_ATTRIB_WPOS][3] = 0.0F; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.attrStepY[FRAG_ATTRIB_WPOS][3] = 0.0F; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_BEGIN 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(span.attrStart[attr], vert->attrib[attr]); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(span.attrStepX[attr], 0, 0, 0, 0); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(span.attrStepY[attr], 0, 0, 0, 0); 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_END 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute pos, bounds and render */ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat x = vert->attrib[FRAG_ATTRIB_WPOS][0]; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat y = vert->attrib[FRAG_ATTRIB_WPOS][1]; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint iSize = (GLint) (size + 0.5F); 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xmin, xmax, ymin, ymax, ix, iy; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint iRadius; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iSize = MAX2(1, iSize); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iRadius = iSize / 2; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iSize & 1) { 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* odd size */ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmin = (GLint) (x - iRadius); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmax = (GLint) (x + iRadius); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymin = (GLint) (y - iRadius); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymax = (GLint) (y + iRadius); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* even size */ 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 0.501 factor allows conformance to pass */ 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmin = (GLint) (x + 0.501) - iRadius; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xmax = xmin + iSize - 1; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymin = (GLint) (y + 0.501) - iRadius; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ymax = ymin + iSize - 1; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* generate fragments */ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.end = 0; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (iy = ymin; iy <= ymax; iy++) { 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ix = xmin; ix <= xmax; ix++) { 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.array->x[span.end] = ix; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.array->y[span.end] = iy; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.end++; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(span.end <= SWRAST_MAX_WIDTH); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, &span); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw size=1, single-pixel point 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpixel_point(struct gl_context *ctx, const SWvertex *vert) 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that unlike the other functions, we put single-pixel points 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * into a special span array in order to render as many points as 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * possible with a single _swrast_write_rgba_span() call. 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWspan *span = &(swrast->PointSpan); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CULL_INVALID(vert); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Span init */ 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->interpMask = 0; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->arrayMask = SPAN_XY | SPAN_Z; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->arrayMask |= SPAN_RGBA; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*span->arrayMask |= SPAN_LAMBDA;*/ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->arrayAttribs = swrast->_ActiveAttribMask; /* we'll produce these vals */ 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need these for fragment programs */ 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->attrStart[FRAG_ATTRIB_WPOS][3] = 1.0F; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->attrStepX[FRAG_ATTRIB_WPOS][3] = 0.0F; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->attrStepY[FRAG_ATTRIB_WPOS][3] = 0.0F; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check if we need to flush */ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (span->end >= SWRAST_MAX_WIDTH || 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (swrast->_RasterMask & (BLEND_BIT | LOGIC_OP_BIT | MASKING_BIT)) || 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->facing != swrast->PointLineFacing) { 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (span->end > 0) { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, span); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->end = 0; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = span->end; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->facing = swrast->PointLineFacing; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fragment attributes */ 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->array->rgba[count][RCOMP] = vert->color[0]; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->array->rgba[count][GCOMP] = vert->color[1]; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->array->rgba[count][BCOMP] = vert->color[2]; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->array->rgba[count][ACOMP] = vert->color[3]; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_BEGIN 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(span->array->attribs[attr][count], vert->attrib[attr]); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ATTRIB_LOOP_END 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fragment position */ 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->array->x[count] = (GLint) vert->attrib[FRAG_ATTRIB_WPOS][0]; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->array->y[count] = (GLint) vert->attrib[FRAG_ATTRIB_WPOS][1]; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->array->z[count] = (GLint) (vert->attrib[FRAG_ATTRIB_WPOS][2] + 0.5F); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span->end = count + 1; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(span->end <= SWRAST_MAX_WIDTH); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add specular color to primary color, draw point, restore original 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * primary color. 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_add_spec_terms_point(struct gl_context *ctx, const SWvertex *v0) 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWvertex *ncv0 = (SWvertex *) v0; /* cast away const */ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat rSum, gSum, bSum; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLchan cSave[4]; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* save */ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_CHAN4(cSave, ncv0->color); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sum */ 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rSum = CHAN_TO_FLOAT(ncv0->color[0]) + ncv0->attrib[FRAG_ATTRIB_COL1][0]; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gSum = CHAN_TO_FLOAT(ncv0->color[1]) + ncv0->attrib[FRAG_ATTRIB_COL1][1]; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bSum = CHAN_TO_FLOAT(ncv0->color[2]) + ncv0->attrib[FRAG_ATTRIB_COL1][2]; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[0], rSum); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[1], gSum); 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[2], bSum); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* draw */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWRAST_CONTEXT(ctx)->SpecPoint(ctx, ncv0); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* restore */ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_CHAN4(ncv0->color, cSave); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Examine current state to determine which point drawing function to use. 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_choose_point(struct gl_context *ctx) 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat size = CLAMP(ctx->Point.Size, 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Point.MinSize, 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Point.MaxSize); 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode == GL_RENDER) { 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.PointSprite) { 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Point = sprite_point; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Point.SmoothFlag) { 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Point = smooth_point; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (size > 1.0 || 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Point._Attenuated || 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.PointSizeEnabled) { 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Point = large_point; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Point = pixel_point; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->RenderMode == GL_FEEDBACK) { 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Point = _swrast_feedback_point; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_SELECT mode */ 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Point = _swrast_select_point; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 573