nvc0: do not always invalidate 3D CBs when using compute
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 26 May 2016 22:30:17 +0000 (00:30 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sat, 28 May 2016 13:50:03 +0000 (15:50 +0200)
Constant buffers are aliased between 3D and CP on Fermi, but we should
only invalidate them when a compute shader actually uses CBs and not
all the time after a lauching grid.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/nvc0/nvc0_compute.c

index 832c085356f484f4cbbaf877669da85eb80340e5..5cc119c00388cbb18542b1e706012e3d146c09d1 100644 (file)
@@ -149,6 +149,19 @@ nvc0_compute_validate_textures(struct nvc0_context *nvc0)
    nvc0->dirty_3d |= NVC0_NEW_3D_TEXTURES;
 }
 
+static inline void
+nvc0_compute_invalidate_constbufs(struct nvc0_context *nvc0)
+{
+   int s;
+
+   /* Invalidate all 3D constbufs because they are aliased with COMPUTE. */
+   for (s = 0; s < 5; s++) {
+      nvc0->constbuf_dirty[s] |= nvc0->constbuf_valid[s];
+      nvc0->state.uniform_buffer_bound[s] = 0;
+   }
+   nvc0->dirty_3d |= NVC0_NEW_3D_CONSTBUF;
+}
+
 static void
 nvc0_compute_validate_constbufs(struct nvc0_context *nvc0)
 {
@@ -203,6 +216,8 @@ nvc0_compute_validate_constbufs(struct nvc0_context *nvc0)
       }
    }
 
+   nvc0_compute_invalidate_constbufs(nvc0);
+
    BEGIN_NVC0(push, NVC0_CP(FLUSH), 1);
    PUSH_DATA (push, NVC0_COMPUTE_FLUSH_CB);
 }
@@ -358,6 +373,8 @@ nvc0_compute_upload_input(struct nvc0_context *nvc0, const void *input)
       PUSH_DATA (push, 0);
       PUSH_DATAp(push, input, cp->parm_size / 4);
 
+      nvc0_compute_invalidate_constbufs(nvc0);
+
       BEGIN_NVC0(push, NVC0_CP(FLUSH), 1);
       PUSH_DATA (push, NVC0_COMPUTE_FLUSH_CB);
    }
@@ -369,7 +386,6 @@ nvc0_launch_grid(struct pipe_context *pipe, const struct pipe_grid_info *info)
    struct nvc0_context *nvc0 = nvc0_context(pipe);
    struct nouveau_pushbuf *push = nvc0->base.pushbuf;
    struct nvc0_program *cp = nvc0->compprog;
-   unsigned s;
    int ret;
 
    ret = !nvc0_state_validate_cp(nvc0, ~0);
@@ -439,11 +455,4 @@ nvc0_launch_grid(struct pipe_context *pipe, const struct pipe_grid_info *info)
 
    /* TODO: Not sure if this is really necessary. */
    nvc0_compute_invalidate_surfaces(nvc0, 5);
-
-   /* Invalidate all 3D constbufs because they are aliased with COMPUTE. */
-   nvc0->dirty_3d |= NVC0_NEW_3D_CONSTBUF;
-   for (s = 0; s < 5; s++) {
-      nvc0->constbuf_dirty[s] |= nvc0->constbuf_valid[s];
-      nvc0->state.uniform_buffer_bound[s] = 0;
-   }
 }