st_atom_rasterizer.c revision e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93
18e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell/************************************************************************** 28e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 38e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 48e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * All Rights Reserved. 58e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 68e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 78e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * copy of this software and associated documentation files (the 88e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * "Software"), to deal in the Software without restriction, including 98e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 108e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 118e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 128e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * the following conditions: 138e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 148e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * The above copyright notice and this permission notice (including the 158e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 168e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * of the Software. 178e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 188e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 198e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 208e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 218e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 228e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 238e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 248e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 258e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 268e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell **************************************************************************/ 278e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 288e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /* 298e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Authors: 308e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Keith Whitwell <keith@tungstengraphics.com> 318e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 328e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 3309ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian#include "main/macros.h" 348e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell#include "st_context.h" 35339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "st_atom.h" 36943964a1e5bad86bdceb0a06d60fb3b302ebce6aKeith Whitwell#include "pipe/p_context.h" 37f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian#include "pipe/p_defines.h" 38339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 39339e7ec6805e6de8794514c0a935081b5d36d38fBrian 408e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 418e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwellstatic GLuint translate_fill( GLenum mode ) 428e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{ 438e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell switch (mode) { 44f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian case GL_POINT: 45f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian return PIPE_POLYGON_MODE_POINT; 46f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian case GL_LINE: 47f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian return PIPE_POLYGON_MODE_LINE; 48f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian case GL_FILL: 49f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian return PIPE_POLYGON_MODE_FILL; 50f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian default: 51f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian assert(0); 52f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian return 0; 538e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 548e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell} 558e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 568e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwellstatic GLboolean get_offset_flag( GLuint fill_mode, 57f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian const struct gl_polygon_attrib *p ) 588e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{ 598e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell switch (fill_mode) { 60f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian case PIPE_POLYGON_MODE_POINT: 61f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian return p->OffsetPoint; 62f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian case PIPE_POLYGON_MODE_LINE: 63f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian return p->OffsetLine; 64f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian case PIPE_POLYGON_MODE_FILL: 65f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian return p->OffsetFill; 66f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian default: 67f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian assert(0); 68f79c225d9e5adee6287a9bba35f014c3fe00d3f9Brian return 0; 698e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 708e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell} 718e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 728e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 73294401814d1d89cc731de1c22c25333aa5d59374Zack Rusinstatic void update_raster_state( struct st_context *st ) 748e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{ 758e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell GLcontext *ctx = st->ctx; 76339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_rasterizer_state *raster = &st->state.rasterizer; 772444f6c6a4c2f54c3198882c2256419628ca49d1Brian const struct gl_vertex_program *vertProg = ctx->VertexProgram._Current; 781b4852345954af9b582b03a91a3d8399b8fb0e92Brian uint i; 798e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 80339e7ec6805e6de8794514c0a935081b5d36d38fBrian memset(raster, 0, sizeof(*raster)); 81017f862de1f857bca29f09794539aaf411014f13Brian 82339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->origin_lower_left = 1; /* Always true for OpenGL */ 838e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 848e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /* _NEW_POLYGON, _NEW_BUFFERS 858e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 868e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell { 87dc313b578386dc07f4916fba98da061af3ab18e5Brian if (ctx->Polygon.FrontFace == GL_CCW) 88339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->front_winding = PIPE_WINDING_CCW; 89dc313b578386dc07f4916fba98da061af3ab18e5Brian else 90339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->front_winding = PIPE_WINDING_CW; 918e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 92dc313b578386dc07f4916fba98da061af3ab18e5Brian /* XXX 93dc313b578386dc07f4916fba98da061af3ab18e5Brian * I think the intention here is that user-created framebuffer objects 94dc313b578386dc07f4916fba98da061af3ab18e5Brian * use Y=0=TOP layout instead of OpenGL's normal Y=0=bottom layout. 95dc313b578386dc07f4916fba98da061af3ab18e5Brian * Flipping Y changes CW to CCW and vice-versa. 96dc313b578386dc07f4916fba98da061af3ab18e5Brian * But this is an implementation/driver-specific artifact - remove... 97dc313b578386dc07f4916fba98da061af3ab18e5Brian */ 98dc313b578386dc07f4916fba98da061af3ab18e5Brian if (ctx->DrawBuffer && ctx->DrawBuffer->Name != 0) 99339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->front_winding ^= PIPE_WINDING_BOTH; 1008e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1018e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1028e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /* _NEW_LIGHT 1038e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 1048e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell if (ctx->Light.ShadeModel == GL_FLAT) 105339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->flatshade = 1; 1068e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 107f0636d9653d142bdf71475d2d2066f5c7c436978Brian /* _NEW_LIGHT | _NEW_PROGRAM 1088e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * 109f0636d9653d142bdf71475d2d2066f5c7c436978Brian * Back-face colors can come from traditional lighting (when 110f0636d9653d142bdf71475d2d2066f5c7c436978Brian * GL_LIGHT_MODEL_TWO_SIDE is set) or from vertex programs (when 111f0636d9653d142bdf71475d2d2066f5c7c436978Brian * GL_VERTEX_PROGRAM_TWO_SIDE is set). Note the logic here. 1128e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 11352da6b559a47eca2c1a8ec1b713e188f38e1d16aBrian if (ctx->VertexProgram._Current) { 114dd235ff1db6a2839607931cc07f9ba6e602ac3d4Brian if (ctx->VertexProgram._Enabled) { 115dd235ff1db6a2839607931cc07f9ba6e602ac3d4Brian /* user-defined program */ 116339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->light_twoside = ctx->VertexProgram.TwoSideEnabled; 117dd235ff1db6a2839607931cc07f9ba6e602ac3d4Brian } 118dd235ff1db6a2839607931cc07f9ba6e602ac3d4Brian else { 119dd235ff1db6a2839607931cc07f9ba6e602ac3d4Brian /* TNL-generated program */ 120339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->light_twoside = ctx->Light.Enabled && ctx->Light.Model.TwoSide; 121dd235ff1db6a2839607931cc07f9ba6e602ac3d4Brian } 122f0636d9653d142bdf71475d2d2066f5c7c436978Brian } 123f0636d9653d142bdf71475d2d2066f5c7c436978Brian else if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) { 124339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->light_twoside = 1; 125f0636d9653d142bdf71475d2d2066f5c7c436978Brian } 1268e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1278e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /* _NEW_POLYGON 1288e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 1298e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell if (ctx->Polygon.CullFlag) { 1308e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) { 131339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->cull_mode = PIPE_WINDING_BOTH; 1328e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1338e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell else if (ctx->Polygon.CullFaceMode == GL_FRONT) { 134339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->cull_mode = raster->front_winding; 1358e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1368e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell else { 137339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->cull_mode = raster->front_winding ^ PIPE_WINDING_BOTH; 1388e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1398e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1408e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1418e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /* _NEW_POLYGON 1428e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 1438e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell { 1448e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell GLuint fill_front = translate_fill( ctx->Polygon.FrontMode ); 1458e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell GLuint fill_back = translate_fill( ctx->Polygon.BackMode ); 1468e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 147339e7ec6805e6de8794514c0a935081b5d36d38fBrian if (raster->front_winding == PIPE_WINDING_CW) { 148339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->fill_cw = fill_front; 149339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->fill_ccw = fill_back; 1508e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1518e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell else { 152339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->fill_cw = fill_back; 153339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->fill_ccw = fill_front; 1548e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1558e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1568e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /* Simplify when culling is active: 1578e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 158339e7ec6805e6de8794514c0a935081b5d36d38fBrian if (raster->cull_mode & PIPE_WINDING_CW) { 159339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->fill_cw = raster->fill_ccw; 1608e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1618e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 162339e7ec6805e6de8794514c0a935081b5d36d38fBrian if (raster->cull_mode & PIPE_WINDING_CCW) { 163339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->fill_ccw = raster->fill_cw; 1648e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1658e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1668e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 167f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian /* _NEW_POLYGON 1688e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 169f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian if (ctx->Polygon.OffsetUnits != 0.0 || 170f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian ctx->Polygon.OffsetFactor != 0.0) { 171339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->offset_cw = get_offset_flag( raster->fill_cw, &ctx->Polygon ); 172339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->offset_ccw = get_offset_flag( raster->fill_ccw, &ctx->Polygon ); 173339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->offset_units = ctx->Polygon.OffsetUnits; 174339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->offset_scale = ctx->Polygon.OffsetFactor; 175f6dffd6ee70473dcbf65420a9c635049199f7a4eBrian } 1768e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1771be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian if (ctx->Polygon.SmoothFlag) 178339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->poly_smooth = 1; 1791be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian 1801be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian if (ctx->Polygon.StippleFlag) 181339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->poly_stipple_enable = 1; 1821be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian 1838e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1848e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell /* _NEW_BUFFERS, _NEW_POLYGON 1858e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */ 186339e7ec6805e6de8794514c0a935081b5d36d38fBrian if (raster->fill_cw != PIPE_POLYGON_MODE_FILL || 187339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->fill_ccw != PIPE_POLYGON_MODE_FILL) 1888e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell { 1898e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell GLfloat mrd = (ctx->DrawBuffer ? 1908e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell ctx->DrawBuffer->_MRD : 1916c534b830c6f5427c391c5225c34561141c201baMichal Krol 1.0f); 1928e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 193339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->offset_units = ctx->Polygon.OffsetFactor * mrd; 194339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->offset_scale = (ctx->Polygon.OffsetUnits * mrd * 1958e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell st->polygon_offset_scale); 1968e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell } 1978e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 1981be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian /* _NEW_POINT 1991be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian */ 200339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->point_size = ctx->Point.Size; 201bc739440c29c551fcc44e9e12d0d9c170d8d24fbKeith Whitwell 202bc739440c29c551fcc44e9e12d0d9c170d8d24fbKeith Whitwell raster->point_size_min = 0; /* temporary, will go away */ 203bc739440c29c551fcc44e9e12d0d9c170d8d24fbKeith Whitwell raster->point_size_max = 1000; /* temporary, will go away */ 204bc739440c29c551fcc44e9e12d0d9c170d8d24fbKeith Whitwell 205339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->point_smooth = ctx->Point.SmoothFlag; 206339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->point_sprite = ctx->Point.PointSprite; 2071b4852345954af9b582b03a91a3d8399b8fb0e92Brian for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) { 2081b4852345954af9b582b03a91a3d8399b8fb0e92Brian if (ctx->Point.CoordReplace[i]) { 2091b4852345954af9b582b03a91a3d8399b8fb0e92Brian if (ctx->Point.SpriteOrigin == GL_UPPER_LEFT) 210339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_UPPER_LEFT; 2111b4852345954af9b582b03a91a3d8399b8fb0e92Brian else 212339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_LOWER_LEFT; 2131b4852345954af9b582b03a91a3d8399b8fb0e92Brian } 2141b4852345954af9b582b03a91a3d8399b8fb0e92Brian else { 215339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_NONE; 2161b4852345954af9b582b03a91a3d8399b8fb0e92Brian } 2171b4852345954af9b582b03a91a3d8399b8fb0e92Brian } 2182444f6c6a4c2f54c3198882c2256419628ca49d1Brian if (vertProg) { 2192444f6c6a4c2f54c3198882c2256419628ca49d1Brian if (vertProg->Base.Id == 0) { 2202444f6c6a4c2f54c3198882c2256419628ca49d1Brian if (vertProg->Base.OutputsWritten & (1 << VERT_RESULT_PSIZ)) { 2212444f6c6a4c2f54c3198882c2256419628ca49d1Brian /* generated program which emits point size */ 222339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->point_size_per_vertex = TRUE; 2232444f6c6a4c2f54c3198882c2256419628ca49d1Brian } 2242444f6c6a4c2f54c3198882c2256419628ca49d1Brian } 2252444f6c6a4c2f54c3198882c2256419628ca49d1Brian else if (ctx->VertexProgram.PointSizeEnabled) { 2262444f6c6a4c2f54c3198882c2256419628ca49d1Brian /* user-defined program and GL_VERTEX_PROGRAM_POINT_SIZE set */ 227339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->point_size_per_vertex = ctx->VertexProgram.PointSizeEnabled; 2282444f6c6a4c2f54c3198882c2256419628ca49d1Brian } 2292444f6c6a4c2f54c3198882c2256419628ca49d1Brian } 230cbf42c45a15d6a132c7f7d4946c422ee3de35e6cBrian Paul if (!raster->point_size_per_vertex) { 231cbf42c45a15d6a132c7f7d4946c422ee3de35e6cBrian Paul /* clamp size now */ 232cbf42c45a15d6a132c7f7d4946c422ee3de35e6cBrian Paul raster->point_size = CLAMP(ctx->Point.Size, 233cbf42c45a15d6a132c7f7d4946c422ee3de35e6cBrian Paul ctx->Point.MinSize, 234cbf42c45a15d6a132c7f7d4946c422ee3de35e6cBrian Paul ctx->Point.MaxSize); 235cbf42c45a15d6a132c7f7d4946c422ee3de35e6cBrian Paul } 2361be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian 2371be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian /* _NEW_LINE 2381be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian */ 239339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->line_smooth = ctx->Line.SmoothFlag; 24009ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian if (ctx->Line.SmoothFlag) { 241339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->line_width = CLAMP(ctx->Line.Width, 24209ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian ctx->Const.MinLineWidthAA, 24309ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian ctx->Const.MaxLineWidthAA); 24409ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian } 24509ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian else { 246339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->line_width = CLAMP(ctx->Line.Width, 24709ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian ctx->Const.MinLineWidth, 24809ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian ctx->Const.MaxLineWidth); 24909ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian } 25009ba1dd4ccb0ed907510cb9403b1fb1fb0ab3658Brian 251339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->line_stipple_enable = ctx->Line.StippleFlag; 252339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->line_stipple_pattern = ctx->Line.StipplePattern; 253a813f654872380547faf67fba75fa30792f87ea6Brian /* GL stipple factor is in [1,256], remap to [0, 255] here */ 254339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->line_stipple_factor = ctx->Line.StippleFactor - 1; 2551be17dc446aa6b0770d76a3eccf79d0faf6608c0Brian 25686352ff70d8c9a31fe0ebb4d02ce4bb4644fe54aBrian /* _NEW_MULTISAMPLE */ 257489fc4d10a57538de59a89e19ce752e4b7253d22Roland Scheidegger if (ctx->Multisample._Enabled) 258339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->multisample = 1; 2598e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 2606abdad28f6f6c69158b942fe420a55f12c71fb08Brian /* _NEW_SCISSOR */ 2616abdad28f6f6c69158b942fe420a55f12c71fb08Brian if (ctx->Scissor.Enabled) 262339e7ec6805e6de8794514c0a935081b5d36d38fBrian raster->scissor = 1; 2636abdad28f6f6c69158b942fe420a55f12c71fb08Brian 2648e33194837dd206d920889851d9cf22190100c99Keith Whitwell raster->gl_rasterization_rules = 1; 2658e33194837dd206d920889851d9cf22190100c99Keith Whitwell 266339e7ec6805e6de8794514c0a935081b5d36d38fBrian cso_set_rasterizer(st->cso_context, raster); 2678e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell} 2688e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 269294401814d1d89cc731de1c22c25333aa5d59374Zack Rusinconst struct st_tracked_state st_update_rasterizer = { 270e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul "st_update_rasterizer", /* name */ 271e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul { 272e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul (_NEW_BUFFERS | 273e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul _NEW_LIGHT | 274e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul _NEW_LINE | 275e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul _NEW_MULTISAMPLE | 276e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul _NEW_POINT | 277e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul _NEW_POLYGON | 278e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul _NEW_PROGRAM | 279e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul _NEW_SCISSOR), /* mesa state dependencies*/ 280e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul 0, /* state tracker dependencies */ 2818e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell }, 282e552140a9a55fcadfe7f28c74a7e0aa1c68cdc93Brian Paul update_raster_state /* update function */ 2838e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell}; 284