The linux-debug target builds...
}
+static INLINE boolean util_get_offset(
+ const struct pipe_rasterizer_state *templ,
+ unsigned fill_mode)
+{
+ switch(fill_mode) {
+ case PIPE_POLYGON_MODE_POINT:
+ return templ->offset_point;
+ case PIPE_POLYGON_MODE_LINE:
+ return templ->offset_line;
+ case PIPE_POLYGON_MODE_FILL:
+ return templ->offset_tri;
+ default:
+ assert(0);
+ return FALSE;
+ }
+}
+
+
#ifdef __cplusplus
}
#endif
key->fill_ccw = CLIP_CULL;
key->fill_cw = CLIP_CULL;
- if (!(templ->cull_mode & PIPE_FACE_FRONT)) {
+ if (!(templ->cull_face & PIPE_FACE_FRONT)) {
if (templ->front_ccw)
key->fill_ccw = translate_fill(templ->fill_front);
else
key->fill_cw = translate_fill(templ->fill_front);
}
- if (!(templ->cull_mode & PIPE_FACE_BACK)) {
+ if (!(templ->cull_face & PIPE_FACE_BACK)) {
if (templ->front_ccw)
key->fill_cw = translate_fill(templ->fill_back);
else
/* Caclculate lookup value for WM IZ table.
*/
if (templ->line_smooth) {
- if (templ->fill_cw == PIPE_POLYGON_MODE_LINE &&
- templ->fill_ccw == PIPE_POLYGON_MODE_LINE) {
+ if (templ->fill_front == PIPE_POLYGON_MODE_LINE &&
+ templ->fill_back == PIPE_POLYGON_MODE_LINE) {
rast->unfilled_aa_line = AA_ALWAYS;
}
- else if (templ->fill_cw == PIPE_POLYGON_MODE_LINE ||
- templ->fill_ccw == PIPE_POLYGON_MODE_LINE) {
+ else if (templ->fill_front == PIPE_POLYGON_MODE_LINE ||
+ templ->fill_back == PIPE_POLYGON_MODE_LINE) {
rast->unfilled_aa_line = AA_SOMETIMES;
}
else {
case PIPE_PRIM_TRIANGLES:
/* PIPE_NEW_RAST
*/
- if (rast->fill_cw != PIPE_POLYGON_MODE_FILL ||
- rast->fill_ccw != PIPE_POLYGON_MODE_FILL)
+ if (rast->fill_front != PIPE_POLYGON_MODE_FILL ||
+ rast->fill_back != PIPE_POLYGON_MODE_FILL)
key.primitive = SF_UNFILLED_TRIS;
else
key.primitive = SF_TRIANGLES;
unsigned line_smooth:1;
unsigned point_sprite:1;
unsigned point_attenuated:1;
- unsigned front_face:2;
- unsigned cull_mode:2;
+ unsigned front_ccw:1;
+ unsigned cull_face:2;
unsigned flatshade_first:1;
unsigned gl_rasterization_rules:1;
unsigned line_last_pixel_enable:1;
/* PIPE_NEW_RAST */
key->scissor = rast->scissor;
- key->front_face = rast->front_winding;
- key->cull_mode = rast->cull_mode;
+ key->front_ccw = rast->front_ccw;
+ key->cull_face = rast->cull_face;
key->line_smooth = rast->line_smooth;
key->line_width = rast->line_width;
key->flatshade_first = rast->flatshade_first;
key->line_stipple = brw->curr.rast->templ.line_stipple_enable;
- key->offset_enable = (brw->curr.rast->templ.offset_cw ||
- brw->curr.rast->templ.offset_ccw);
+ key->offset_enable = (brw->curr.rast->templ.offset_point ||
+ brw->curr.rast->templ.offset_line ||
+ brw->curr.rast->templ.offset_tri);
key->offset_units = brw->curr.rast->templ.offset_units;
key->offset_factor = brw->curr.rast->templ.offset_scale;
so_data(so, cso->poly_smooth ? 1 : 0);
so_method(so, tesla, NV50TCL_CULL_FACE_ENABLE, 3);
- so_data (so, cso->cull_mode != PIPE_FACE_NONE);
+ so_data (so, cso->cull_face != PIPE_FACE_NONE);
if (cso->front_ccw) {
so_data(so, NV50TCL_FRONT_FACE_CCW);
}
sb_method(sb, NV34TCL_POLYGON_MODE_FRONT, 6);
sb_data(sb, nvgl_polygon_mode(cso->fill_front));
sb_data(sb, nvgl_polygon_mode(cso->fill_back));
- switch (cso->cull_mode) {
+ switch (cso->cull_face) {
case PIPE_FACE_FRONT:
sb_data(sb, NV34TCL_CULL_FACE_FRONT);
break;
rs->cull_mode = R300_FRONT_FACE_CW;
/* Polygon offset */
- if (state->offset_front) {
+ if (util_get_offset(state, state->fill_front)) {
rs->polygon_offset_enable |= R300_FRONT_ENABLE;
}
- if (state->offset_back) {
+ if (util_get_offset(state, state->fill_back)) {
rs->polygon_offset_enable |= R300_BACK_ENABLE;
}
}
if (rs) {
- r300->polygon_offset_enabled = rs->rs.offset_cw || rs->rs.offset_ccw;
+ r300->polygon_offset_enabled = (rs->rs.offset_point ||
+ rs->rs.offset_line ||
+ rs->rs.offset_tri);
r300->sprite_coord_enable = rs->rs.sprite_coord_enable;
r300->two_sided_color = rs->rs.light_twoside;
} else {
/* fill_cw, fill_ccw - draw module or index translation */
rast->shademode = svga_translate_flatshade( templ->flatshade );
- rast->cullmode = svga_translate_cullmode( templ->cull_mode,
+ rast->cullmode = svga_translate_cullmode( templ->cull_face,
templ->front_ccw );
rast->scissortestenable = templ->scissor;
rast->multisampleantialias = templ->multisample;
rast->need_pipeline |= SVGA_PIPELINE_FLAG_POINTS;
{
- boolean offset_cw = templ->offset_cw;
- boolean offset_ccw = templ->offset_ccw;
- boolean offset = 0;
- int fill_cw = templ->fill_cw;
- int fill_ccw = templ->fill_ccw;
+ int fill_front = templ->fill_front;
+ int fill_back = templ->fill_back;
int fill = PIPE_POLYGON_MODE_FILL;
+ boolean offset_front = util_get_offset(templ, fill_front);
+ boolean offset_back = util_get_offset(templ, fill_back);
+ boolean offset = 0;
switch (templ->cull_face) {
case PIPE_FACE_FRONT_AND_BACK:
dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
dsa.stencil[0].valuemask = ~0;
- raster.cull_mode = raster.front_winding ^ PIPE_WINDING_BOTH;
+ raster.cull_face = PIPE_FACE_BACK;
dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
cso_set_rasterizer(ctx->cso_context, &raster);
draw_polygon(ctx, poly);
- raster.cull_mode = raster.front_winding;
+ raster.cull_face = PIPE_FACE_FRONT;
dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
dsa.stencil[0].func = PIPE_FUNC_ALWAYS;
dsa.stencil[0].valuemask = ~0;
- raster.cull_mode = raster.front_winding ^ PIPE_WINDING_BOTH;
+ raster.cull_face = PIPE_FACE_BACK;
dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_INCR_WRAP;
draw_polygon(ctx, poly);
}
- raster.cull_mode = raster.front_winding;
+ raster.cull_face = PIPE_FACE_FRONT;
dsa.stencil[0].fail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zfail_op = PIPE_STENCIL_OP_KEEP;
dsa.stencil[0].zpass_op = PIPE_STENCIL_OP_DECR_WRAP;
}
}
-static GLboolean get_offset_flag( GLuint fill_mode,
- const struct gl_polygon_attrib *p )
-{
- switch (fill_mode) {
- case PIPE_POLYGON_MODE_POINT:
- return p->OffsetPoint;
- case PIPE_POLYGON_MODE_LINE:
- return p->OffsetLine;
- case PIPE_POLYGON_MODE_FILL:
- return p->OffsetFill;
- default:
- assert(0);
- return 0;
- }
-}
static void update_raster_state( struct st_context *st )
/* _NEW_POLYGON, _NEW_BUFFERS
*/
{
- if (ctx->Polygon.FrontFace == GL_CCW)
- raster->front_winding = PIPE_WINDING_CCW;
- else
- raster->front_winding = PIPE_WINDING_CW;
+ raster->front_ccw = (ctx->Polygon.FrontFace == GL_CCW);
/* XXX
* I think the intention here is that user-created framebuffer objects
* But this is an implementation/driver-specific artifact - remove...
*/
if (ctx->DrawBuffer && ctx->DrawBuffer->Name != 0)
- raster->front_winding ^= PIPE_WINDING_BOTH;
+ raster->front_ccw ^= 1;
}
/* _NEW_LIGHT
/* _NEW_POLYGON
*/
if (ctx->Polygon.CullFlag) {
- if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) {
- raster->cull_mode = PIPE_WINDING_BOTH;
- }
- else if (ctx->Polygon.CullFaceMode == GL_FRONT) {
- raster->cull_mode = raster->front_winding;
- }
- else {
- raster->cull_mode = raster->front_winding ^ PIPE_WINDING_BOTH;
+ switch (ctx->Polygon.CullFaceMode) {
+ case GL_FRONT:
+ raster->cull_face = PIPE_FACE_FRONT;
+ break;
+ case GL_BACK:
+ raster->cull_face = PIPE_FACE_BACK;
+ break;
+ case GL_FRONT_AND_BACK:
+ raster->cull_face = PIPE_FACE_FRONT_AND_BACK;
+ break;
}
}
+ else {
+ raster->cull_face = PIPE_FACE_NONE;
+ }
/* _NEW_POLYGON
*/
{
- GLuint fill_front = translate_fill( ctx->Polygon.FrontMode );
- GLuint fill_back = translate_fill( ctx->Polygon.BackMode );
-
- if (raster->front_winding == PIPE_WINDING_CW) {
- raster->fill_cw = fill_front;
- raster->fill_ccw = fill_back;
- }
- else {
- raster->fill_cw = fill_back;
- raster->fill_ccw = fill_front;
- }
+ raster->fill_front = translate_fill( ctx->Polygon.FrontMode );
+ raster->fill_back = translate_fill( ctx->Polygon.BackMode );
/* Simplify when culling is active:
*/
- if (raster->cull_mode & PIPE_WINDING_CW) {
- raster->fill_cw = raster->fill_ccw;
+ if (raster->cull_face & PIPE_FACE_FRONT) {
+ raster->fill_front = raster->fill_back;
}
- if (raster->cull_mode & PIPE_WINDING_CCW) {
- raster->fill_ccw = raster->fill_cw;
+ if (raster->cull_face & PIPE_FACE_BACK) {
+ raster->fill_back = raster->fill_front;
}
}
*/
if (ctx->Polygon.OffsetUnits != 0.0 ||
ctx->Polygon.OffsetFactor != 0.0) {
- raster->offset_cw = get_offset_flag( raster->fill_cw, &ctx->Polygon );
- raster->offset_ccw = get_offset_flag( raster->fill_ccw, &ctx->Polygon );
+ raster->offset_point = ctx->Polygon.OffsetPoint;
+ raster->offset_line = ctx->Polygon.OffsetLine;
+ raster->offset_tri = ctx->Polygon.OffsetFill;
+ }
+
+ if (ctx->Polygon.OffsetPoint ||
+ ctx->Polygon.OffsetLine ||
+ ctx->Polygon.OffsetFill) {
raster->offset_units = ctx->Polygon.OffsetUnits;
raster->offset_scale = ctx->Polygon.OffsetFactor;
}