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