Specifically, non-line primitives skipped, and defaulting to reset on
each packet.

The skip of non-line primitives saves ≈110 resetting of
PA_SC_LINE_STIPPLE register per frame in Kane&Lynch2.

Signed-off-by: Constantine Kharlamov <hi-an...@yandex.ru>
---
 src/gallium/drivers/r600/r600_state_common.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_state_common.c 
b/src/gallium/drivers/r600/r600_state_common.c
index e4d1660933..4de2a7344b 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -1670,19 +1670,24 @@ void r600_emit_clip_misc_state(struct r600_context 
*rctx, struct r600_atom *atom
 static inline void r600_emit_rasterizer_prim_state(struct r600_context *rctx)
 {
        struct radeon_winsys_cs *cs = rctx->b.gfx.cs;
-       unsigned ls_mask = 0;
        enum pipe_prim_type rast_prim = rctx->current_rast_prim;
-       if (rast_prim == rctx->last_rast_prim)
+
+       /* Skip this if not rendering lines. */
+       if (rast_prim != PIPE_PRIM_LINES &&
+           rast_prim != PIPE_PRIM_LINE_LOOP &&
+           rast_prim != PIPE_PRIM_LINE_STRIP &&
+           rast_prim != PIPE_PRIM_LINES_ADJACENCY &&
+           rast_prim != PIPE_PRIM_LINE_STRIP_ADJACENCY)
                return;
 
-       if (rast_prim == PIPE_PRIM_LINES)
-               ls_mask = 1;
-       else if (rast_prim == PIPE_PRIM_LINE_STRIP ||
-                rast_prim == PIPE_PRIM_LINE_LOOP)
-               ls_mask = 2;
+       if (rast_prim == rctx->last_rast_prim)
+               return;
 
+       /* For lines, reset the stipple pattern at each primitive. Otherwise,
+        * reset the stipple pattern at each packet (line strips, line loops).
+        */
        radeon_set_context_reg(cs, R_028A0C_PA_SC_LINE_STIPPLE,
-                              S_028A0C_AUTO_RESET_CNTL(ls_mask) |
+                              S_028A0C_AUTO_RESET_CNTL(rast_prim == 
PIPE_PRIM_LINES ? 1 : 2) |
                               (rctx->rasterizer ? 
rctx->rasterizer->pa_sc_line_stipple : 0));
        rctx->last_rast_prim = rast_prim;
 }
-- 
2.12.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to