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