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/context.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_aaline.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_context.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_feedback.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_lines.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_span.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Init the mask[] array to implement a line stipple. 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_stipple_mask( struct gl_context *ctx, GLuint len, GLubyte mask[] ) 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < len; i++) { 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((1 << bit) & ctx->Line.StipplePattern) { 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask[i] = GL_TRUE; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask[i] = GL_FALSE; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->StippleCounter++; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * To draw a wide line we can simply redraw the span N times, side by side. 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_wide_line( struct gl_context *ctx, SWspan *span, GLboolean xMajor ) 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint width = (GLint) CLAMP(ctx->Line.Width, 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.MinLineWidth, 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.MaxLineWidth); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint start; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(span->end < SWRAST_MAX_WIDTH); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width & 1) 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start = width / 2; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start = width / 2 - 1; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xMajor) { 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *y = span->array->y; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint w; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (w = 0; w < width; w++) { 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (w == 0) { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < span->end; i++) 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y[i] -= start; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < span->end; i++) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y[i]++; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, span); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *x = span->array->x; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint w; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (w = 0; w < width; w++) { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (w == 0) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < span->end; i++) 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x[i] -= start; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < span->end; i++) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x[i]++; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, span); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Rasterization *****/ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME simple_no_z_rgba_line 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_RGBA 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN(span) _swrast_write_rgba_span(ctx, &span); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_linetemp.h" 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Z, fog, wide, stipple RGBA line */ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME rgba_line 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_RGBA 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_Z 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN(span) \ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.StippleFlag) { \ 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.arrayMask |= SPAN_MASK; \ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_stipple_mask(ctx, span.end, span.array->mask); \ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.Width > 1.0) { \ 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, &span); \ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_linetemp.h" 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* General-purpose line (any/all features). */ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME general_line 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_RGBA 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_Z 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_ATTRIBS 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN(span) \ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.StippleFlag) { \ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org span.arrayMask |= SPAN_MASK; \ 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_stipple_mask(ctx, span.end, span.array->mask); \ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.Width > 1.0) { \ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org draw_wide_line(ctx, &span, (GLboolean)(dx > dy)); \ 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_write_rgba_span(ctx, &span); \ 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_linetemp.h" 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_add_spec_terms_line(struct gl_context *ctx, 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const SWvertex *v0, const SWvertex *v1) 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWvertex *ncv0 = (SWvertex *)v0; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWvertex *ncv1 = (SWvertex *)v1; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat rSum, gSum, bSum; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLchan cSave[2][4]; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* save original colors */ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_CHAN4(cSave[0], ncv0->color); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_CHAN4(cSave[1], ncv1->color); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sum v0 */ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rSum = CHAN_TO_FLOAT(ncv0->color[0]) + ncv0->attrib[FRAG_ATTRIB_COL1][0]; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gSum = CHAN_TO_FLOAT(ncv0->color[1]) + ncv0->attrib[FRAG_ATTRIB_COL1][1]; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bSum = CHAN_TO_FLOAT(ncv0->color[2]) + ncv0->attrib[FRAG_ATTRIB_COL1][2]; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[0], rSum); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[1], gSum); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[2], bSum); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sum v1 */ 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rSum = CHAN_TO_FLOAT(ncv1->color[0]) + ncv1->attrib[FRAG_ATTRIB_COL1][0]; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gSum = CHAN_TO_FLOAT(ncv1->color[1]) + ncv1->attrib[FRAG_ATTRIB_COL1][1]; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bSum = CHAN_TO_FLOAT(ncv1->color[2]) + ncv1->attrib[FRAG_ATTRIB_COL1][2]; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[0], rSum); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[1], gSum); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[2], bSum); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* draw */ 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 ); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* restore original colors */ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_CHAN4(ncv0->color, cSave[0]); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_CHAN4(ncv1->color, cSave[1]); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* record the current line function name */ 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *lineFuncName = NULL; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define USE(lineFunc) \ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { \ 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lineFuncName = #lineFunc; \ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*printf("%s\n", lineFuncName);*/ \ 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swrast->Line = lineFunc; \ 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define USE(lineFunc) swrast->Line = lineFunc 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine which line drawing function to use given the current 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering context. 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Please update the summary flag _SWRAST_NEW_LINE if you add or remove 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tests to this code. 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_choose_line( struct gl_context *ctx ) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWcontext *swrast = SWRAST_CONTEXT(ctx); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean specular = (ctx->Fog.ColorSumEnabled || 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->Light.Enabled && 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->RenderMode == GL_RENDER) { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Line.SmoothFlag) { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* antialiased lines */ 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _swrast_choose_aa_line_function(ctx); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(swrast->Line); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Texture._EnabledCoordUnits 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || _swrast_use_fragment_program(ctx) 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || swrast->_FogEnabled 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || specular) { 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org USE(general_line); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Depth.Test 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || ctx->Line.Width != 1.0 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || ctx->Line.StippleFlag) { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no texture, but Z, fog, width>1, stipple, etc. */ 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if CHAN_BITS == 32 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org USE(general_line); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org USE(rgba_line); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(!ctx->Depth.Test); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(ctx->Line.Width == 1.0); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple lines */ 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org USE(simple_no_z_rgba_line); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->RenderMode == GL_FEEDBACK) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org USE(_swrast_feedback_line); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(ctx->RenderMode == GL_SELECT); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org USE(_swrast_select_line); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 269