vc4: Don't look up the compiled shaders unless state has changed.
authorEric Anholt <eric@anholt.net>
Fri, 10 Oct 2014 12:17:15 +0000 (14:17 +0200)
committerEric Anholt <eric@anholt.net>
Fri, 10 Oct 2014 13:49:22 +0000 (15:49 +0200)
Improves simulated norast performance on a little benchmark by 38.0965%
+/- 3.27534% (n=11).

src/gallium/drivers/vc4/vc4_context.h
src/gallium/drivers/vc4/vc4_draw.c
src/gallium/drivers/vc4/vc4_program.c

index da07cfa6cb2ba7da2387edc60733cde7f416c05c..31dec046860a381cf99a817775164180a54cf0dc 100644 (file)
@@ -57,6 +57,7 @@
 #define VC4_DIRTY_INDEXBUF      (1 << 16)
 #define VC4_DIRTY_SCISSOR       (1 << 17)
 #define VC4_DIRTY_FLAT_SHADE_FLAGS (1 << 18)
+#define VC4_DIRTY_PRIM_MODE     (1 << 19)
 
 #define VC4_SHADER_DIRTY_VP     (1 << 0)
 #define VC4_SHADER_DIRTY_FP     (1 << 1)
@@ -177,6 +178,8 @@ struct vc4_context {
         unsigned int reg_class_any;
         unsigned int reg_class_a;
 
+        uint8_t prim_mode;
+
         /** @{ Current pipeline state objects */
         struct pipe_scissor_state scissor;
         struct pipe_blend_state *blend;
index bc08da3734cd514ac69002a090183e5097185c8a..1a0c0dc6552a8d839e6722717f99aa3f5bd33c4d 100644 (file)
@@ -99,6 +99,11 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
         struct vc4_vertex_stateobj *vtx = vc4->vtx;
         struct vc4_vertexbuf_stateobj *vertexbuf = &vc4->vertexbuf;
 
+        if (vc4->prim_mode != info->mode) {
+                vc4->prim_mode = info->mode;
+                vc4->dirty |= VC4_DIRTY_PRIM_MODE;
+        }
+
         vc4_start_draw(vc4);
         vc4_update_compiled_shaders(vc4, info->mode);
 
index bf76acff2cde6c241d647263ba0268a4ea584e1b..b22426cf9aaeecba123ee50edd0a45f3fcdde0b5 100644 (file)
@@ -1792,6 +1792,17 @@ vc4_update_compiled_fs(struct vc4_context *vc4, uint8_t prim_mode)
         struct vc4_fs_key local_key;
         struct vc4_fs_key *key = &local_key;
 
+        if (!(vc4->dirty & (VC4_DIRTY_PRIM_MODE |
+                            VC4_DIRTY_BLEND |
+                            VC4_DIRTY_FRAMEBUFFER |
+                            VC4_DIRTY_ZSA |
+                            VC4_DIRTY_RASTERIZER |
+                            VC4_DIRTY_FRAGTEX |
+                            VC4_DIRTY_TEXSTATE |
+                            VC4_DIRTY_PROG))) {
+                return;
+        }
+
         memset(key, 0, sizeof(*key));
         vc4_setup_shared_key(&key->base, &vc4->fragtex);
         key->base.shader_state = vc4->prog.bind_fs;
@@ -1840,6 +1851,15 @@ vc4_update_compiled_vs(struct vc4_context *vc4, uint8_t prim_mode)
         struct vc4_vs_key local_key;
         struct vc4_vs_key *key = &local_key;
 
+        if (!(vc4->dirty & (VC4_DIRTY_PRIM_MODE |
+                            VC4_DIRTY_RASTERIZER |
+                            VC4_DIRTY_VERTTEX |
+                            VC4_DIRTY_TEXSTATE |
+                            VC4_DIRTY_VTXSTATE |
+                            VC4_DIRTY_PROG))) {
+                return;
+        }
+
         memset(key, 0, sizeof(*key));
         vc4_setup_shared_key(&key->base, &vc4->verttex);
         key->base.shader_state = vc4->prog.bind_vs;