r600g: check rasterizer primitive states like in radeonsi
authorConstantine Kharlamov <Hi-Angel@yandex.ru>
Sun, 2 Apr 2017 17:33:06 +0000 (20:33 +0300)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 4 Apr 2017 20:15:47 +0000 (22:15 +0200)
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-Angel@yandex.ru>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
src/gallium/drivers/r600/r600_state_common.c

index e4d166093390244e539e41e974445afc4a3b2ff5..4de2a7344b24b6bc56038902117f4ad3826dce74 100644 (file)
@@ -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;
 }