r600g: add eg poly mode code.
authorDave Airlie <airlied@redhat.com>
Sat, 25 Sep 2010 09:16:36 +0000 (19:16 +1000)
committerDave Airlie <airlied@redhat.com>
Sat, 25 Sep 2010 09:16:36 +0000 (19:16 +1000)
src/gallium/drivers/r600/eg_hw_states.c
src/gallium/drivers/r600/eg_state_inlines.h

index 7ba53fefb5d15e432de609c09cd54d5ad33ca937..998d74bd3ebaf3ad856d027fbc7124475aa52848 100644 (file)
@@ -200,6 +200,7 @@ static void eg_rasterizer(struct r600_context *rctx, struct radeon_state *rstate
        unsigned offset_db_fmt_cntl = 0;
        unsigned tmp;
        unsigned prov_vtx = 1;
+       unsigned polygon_dual_mode;
 
        if (rctx->clip)
                clip = &rctx->clip->state.clip;
@@ -254,6 +255,9 @@ static void eg_rasterizer(struct r600_context *rctx, struct radeon_state *rstate
                rstate->states[EG_RASTERIZER__PA_CL_CLIP_CNTL] |= S_028810_ZCLIP_NEAR_DISABLE(clip->depth_clamp);
                rstate->states[EG_RASTERIZER__PA_CL_CLIP_CNTL] |= S_028810_ZCLIP_FAR_DISABLE(clip->depth_clamp);
        }
+       polygon_dual_mode = (state->fill_front != PIPE_POLYGON_MODE_FILL ||
+                            state->fill_back != PIPE_POLYGON_MODE_FILL);
+
        rstate->states[EG_RASTERIZER__PA_SU_SC_MODE_CNTL] =
                S_028814_PROVOKING_VTX_LAST(prov_vtx) |
                S_028814_CULL_FRONT((state->cull_face & PIPE_FACE_FRONT) ? 1 : 0) |
@@ -261,7 +265,10 @@ static void eg_rasterizer(struct r600_context *rctx, struct radeon_state *rstate
                S_028814_FACE(!state->front_ccw) |
                S_028814_POLY_OFFSET_FRONT_ENABLE(state->offset_tri) |
                S_028814_POLY_OFFSET_BACK_ENABLE(state->offset_tri) |
-               S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri);
+               S_028814_POLY_OFFSET_PARA_ENABLE(state->offset_tri) |
+               S_028814_POLY_MODE(polygon_dual_mode) |
+               S_028814_POLYMODE_FRONT_PTYPE(r600_translate_fill(state->fill_front)) |
+               S_028814_POLYMODE_BACK_PTYPE(r600_translate_fill(state->fill_back));
        rstate->states[EG_RASTERIZER__PA_CL_VS_OUT_CNTL] =
                        S_02881C_USE_VTX_POINT_SIZE(state->point_size_per_vertex) |
                        S_02881C_VS_OUT_MISC_VEC_ENA(state->point_size_per_vertex);
index 251e64a67a0e32cb7bf2a5e8348fcda066801f43..497865a66ddaf034365f52c02cb7d32dbb204f59 100644 (file)
@@ -123,6 +123,21 @@ static INLINE uint32_t r600_translate_stencil_op(int s_op)
        return 0;
 }
 
+static INLINE uint32_t r600_translate_fill(uint32_t func)
+{
+       switch(func) {
+       case PIPE_POLYGON_MODE_FILL:
+               return 2;
+       case PIPE_POLYGON_MODE_LINE:
+               return 1;
+       case PIPE_POLYGON_MODE_POINT:
+               return 0;
+       default:
+               assert(0);
+               return 0;
+       }
+}
+
 /* translates straight */
 static INLINE uint32_t r600_translate_ds_func(int func)
 {