1cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell/*
2cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * Mesa 3-D graphics library
36c342ad8593c3b2fe5162aeb2db8c309c15b2fafBrian * Version:  7.0
422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
56c342ad8593c3b2fe5162aeb2db8c309c15b2fafBrian * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
7cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
8cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * copy of this software and associated documentation files (the "Software"),
9cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * to deal in the Software without restriction, including without limitation
10cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
12cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * Software is furnished to do so, subject to the following conditions:
1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
14cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * The above copyright notice and this permission notice shall be included
15cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * in all copies or substantial portions of the Software.
1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
17cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */
24cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
25bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h"
26bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/colormac.h"
27bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/feedback.h"
28bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h"
29cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
30cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h"
31cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h"
32cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_triangle.h"
33cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
34cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
35cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
36c33c00764c64f63ae71b4bb5264f9796d5762495Brianstatic void
37f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergfeedback_vertex(struct gl_context * ctx, const SWvertex * v, const SWvertex * pv)
38cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{
39cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   GLfloat win[4];
40dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian   const GLfloat *vtc = v->attrib[FRAG_ATTRIB_TEX0];
411bf507656921f216a69599143f1aef9bbb170b4eBrian   const GLfloat *color = v->attrib[FRAG_ATTRIB_COL0];
42cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
439e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   win[0] = v->attrib[FRAG_ATTRIB_WPOS][0];
449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   win[1] = v->attrib[FRAG_ATTRIB_WPOS][1];
459e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   win[2] = v->attrib[FRAG_ATTRIB_WPOS][2] / ctx->DrawBuffer->_DepthMaxF;
469e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   win[3] = 1.0F / v->attrib[FRAG_ATTRIB_WPOS][3];
47cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
4824d311c13339978a37885e88a49a990903652339Ian Romanick   _mesa_feedback_vertex(ctx, win, color, vtc);
49cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell}
50cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
51cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
52cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell/*
53cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * Put triangle in feedback buffer.
54cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */
55c33c00764c64f63ae71b4bb5264f9796d5762495Brianvoid
56f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_feedback_triangle(struct gl_context *ctx, const SWvertex *v0,
57c33c00764c64f63ae71b4bb5264f9796d5762495Brian                          const SWvertex *v1, const SWvertex *v2)
58cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{
598f4d66c5f893b49eb3973aa3b31a856314c045c7Brian Paul   if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
60bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token(ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN);
61bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul      _mesa_feedback_token(ctx, (GLfloat) 3); /* three vertices */
6222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
631e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell      if (ctx->Light.ShadeModel == GL_SMOOTH) {
64c33c00764c64f63ae71b4bb5264f9796d5762495Brian         feedback_vertex(ctx, v0, v0);
65c33c00764c64f63ae71b4bb5264f9796d5762495Brian         feedback_vertex(ctx, v1, v1);
66c33c00764c64f63ae71b4bb5264f9796d5762495Brian         feedback_vertex(ctx, v2, v2);
67c33c00764c64f63ae71b4bb5264f9796d5762495Brian      }
68c33c00764c64f63ae71b4bb5264f9796d5762495Brian      else {
69c33c00764c64f63ae71b4bb5264f9796d5762495Brian         feedback_vertex(ctx, v0, v2);
70c33c00764c64f63ae71b4bb5264f9796d5762495Brian         feedback_vertex(ctx, v1, v2);
71c33c00764c64f63ae71b4bb5264f9796d5762495Brian         feedback_vertex(ctx, v2, v2);
721e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell      }
73cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   }
74cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell}
75cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
76cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
77c33c00764c64f63ae71b4bb5264f9796d5762495Brianvoid
78f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_feedback_line(struct gl_context *ctx, const SWvertex *v0,
79c33c00764c64f63ae71b4bb5264f9796d5762495Brian                      const SWvertex *v1)
80cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{
81cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   GLenum token = GL_LINE_TOKEN;
82cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
83cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
84c33c00764c64f63ae71b4bb5264f9796d5762495Brian   if (swrast->StippleCounter == 0)
85cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      token = GL_LINE_RESET_TOKEN;
86cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
87bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul   _mesa_feedback_token(ctx, (GLfloat) (GLint) token);
88cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
891e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell   if (ctx->Light.ShadeModel == GL_SMOOTH) {
90c33c00764c64f63ae71b4bb5264f9796d5762495Brian      feedback_vertex(ctx, v0, v0);
91c33c00764c64f63ae71b4bb5264f9796d5762495Brian      feedback_vertex(ctx, v1, v1);
92c33c00764c64f63ae71b4bb5264f9796d5762495Brian   }
93c33c00764c64f63ae71b4bb5264f9796d5762495Brian   else {
94c33c00764c64f63ae71b4bb5264f9796d5762495Brian      feedback_vertex(ctx, v0, v1);
95c33c00764c64f63ae71b4bb5264f9796d5762495Brian      feedback_vertex(ctx, v1, v1);
961e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell   }
97cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
98cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   swrast->StippleCounter++;
99cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell}
100cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
101cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
102c33c00764c64f63ae71b4bb5264f9796d5762495Brianvoid
103f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_feedback_point(struct gl_context *ctx, const SWvertex *v)
104cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{
105bf8a187f71bd667a0dc0f70164a897d8e62361a8Brian Paul   _mesa_feedback_token(ctx, (GLfloat) (GLint) GL_POINT_TOKEN);
106c33c00764c64f63ae71b4bb5264f9796d5762495Brian   feedback_vertex(ctx, v, v);
107cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell}
108cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
109cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
110c33c00764c64f63ae71b4bb5264f9796d5762495Brianvoid
111f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_select_triangle(struct gl_context *ctx, const SWvertex *v0,
112c33c00764c64f63ae71b4bb5264f9796d5762495Brian                        const SWvertex *v1, const SWvertex *v2)
113cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{
1148f4d66c5f893b49eb3973aa3b31a856314c045c7Brian Paul   if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
115e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
1169e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian
1179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      _mesa_update_hitflag( ctx, v0->attrib[FRAG_ATTRIB_WPOS][2] * zs );
1189e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      _mesa_update_hitflag( ctx, v1->attrib[FRAG_ATTRIB_WPOS][2] * zs );
1199e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      _mesa_update_hitflag( ctx, v2->attrib[FRAG_ATTRIB_WPOS][2] * zs );
120cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   }
121cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell}
122cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
123cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
124c33c00764c64f63ae71b4bb5264f9796d5762495Brianvoid
125f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_select_line(struct gl_context *ctx, const SWvertex *v0, const SWvertex *v1)
126cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{
127e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
1289e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   _mesa_update_hitflag( ctx, v0->attrib[FRAG_ATTRIB_WPOS][2] * zs );
1299e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   _mesa_update_hitflag( ctx, v1->attrib[FRAG_ATTRIB_WPOS][2] * zs );
130cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell}
131cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
132cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
133c33c00764c64f63ae71b4bb5264f9796d5762495Brianvoid
134f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_select_point(struct gl_context *ctx, const SWvertex *v)
135cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{
136e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
1379e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   _mesa_update_hitflag( ctx, v->attrib[FRAG_ATTRIB_WPOS][2] * zs );
138cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell}
139