nvc0: bind driver constbuf for compute on Fermi
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 11 Jan 2016 21:11:19 +0000 (22:11 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sun, 21 Feb 2016 09:41:32 +0000 (10:41 +0100)
Changes from v3:
 - add new validation state for COMPUTE driver constbuf

Changes from v2:
 - always bind the driver consts even if user params come in via clover

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
src/gallium/drivers/nouveau/nvc0/nvc0_context.c
src/gallium/drivers/nouveau/nvc0/nvc0_context.h
src/gallium/drivers/nouveau/nvc0/nvc0_program.c
src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c

index 0fe6353b2ab5255f7587892224ef7823b2c387fd..2314c5386ca640ab46bd95c6734ea69737b05196 100644 (file)
@@ -196,6 +196,22 @@ nvc0_compute_validate_constbufs(struct nvc0_context *nvc0)
    PUSH_DATA (push, NVC0_COMPUTE_FLUSH_CB);
 }
 
+static void
+nvc0_compute_validate_driverconst(struct nvc0_context *nvc0)
+{
+   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
+   struct nvc0_screen *screen = nvc0->screen;
+
+   BEGIN_NVC0(push, NVC0_COMPUTE(CB_SIZE), 3);
+   PUSH_DATA (push, 1024);
+   PUSH_DATAh(push, screen->uniform_bo->offset + (6 << 16) + (5 << 10));
+   PUSH_DATA (push, screen->uniform_bo->offset + (6 << 16) + (5 << 10));
+   BEGIN_NVC0(push, NVC0_COMPUTE(CB_BIND), 1);
+   PUSH_DATA (push, (15 << 8) | 1);
+
+   nvc0->dirty |= NVC0_NEW_DRIVERCONST;
+}
+
 static bool
 nvc0_compute_state_validate(struct nvc0_context *nvc0)
 {
@@ -203,6 +219,8 @@ nvc0_compute_state_validate(struct nvc0_context *nvc0)
       return false;
    if (nvc0->dirty_cp & NVC0_NEW_CP_CONSTBUF)
       nvc0_compute_validate_constbufs(nvc0);
+   if (nvc0->dirty_cp & NVC0_NEW_CP_DRIVERCONST)
+      nvc0_compute_validate_driverconst(nvc0);
 
    /* TODO: textures, samplers, surfaces, global memory buffers */
 
index 4fed7b24a765af11dfe54faab8b255de99062570..3d2ed75e03afdd51bfbcb2938d762a6a957e60ce 100644 (file)
@@ -349,6 +349,11 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags)
    /* set the empty tctl prog on next draw in case one is never set */
    nvc0->dirty |= NVC0_NEW_TCTLPROG;
 
+   /* Do not bind the COMPUTE driver constbuf at screen initialization because
+    * CBs are aliased between 3D and COMPUTE, but make sure it will be bound if
+    * a grid is launched later. */
+   nvc0->dirty_cp |= NVC0_NEW_CP_DRIVERCONST;
+
    /* now that there are no more opportunities for errors, set the current
     * context if there isn't already one.
     */
@@ -368,6 +373,7 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags)
    BCTX_REFN_bo(nvc0->bufctx_3d, SCREEN, flags, screen->txc);
    if (screen->compute) {
       BCTX_REFN_bo(nvc0->bufctx_cp, CP_SCREEN, flags, screen->text);
+      BCTX_REFN_bo(nvc0->bufctx_cp, CP_SCREEN, flags, screen->uniform_bo);
       BCTX_REFN_bo(nvc0->bufctx_cp, CP_SCREEN, flags, screen->txc);
       BCTX_REFN_bo(nvc0->bufctx_cp, CP_SCREEN, flags, screen->parm);
    }
index d8dc48b1f0dc051da9a72cb997bdd896c1960d63..86116a07f85b8766464fd43bf7534226fb21b16d 100644 (file)
@@ -65,6 +65,7 @@
 #define NVC0_NEW_CP_SAMPLERS  (1 << 3)
 #define NVC0_NEW_CP_CONSTBUF  (1 << 4)
 #define NVC0_NEW_CP_GLOBALS   (1 << 5)
+#define NVC0_NEW_CP_DRIVERCONST (1 << 6)
 
 /* 3d bufctx (during draw_vbo, blit_3d) */
 #define NVC0_BIND_FB            0
index 93f211bd5fca657732d6c0a0172e840587f8a0e2..afcff5371477c2d2416e5460c5f4e32a671473ec 100644 (file)
@@ -544,6 +544,8 @@ nvc0_program_translate(struct nvc0_program *prog, uint16_t chipset,
          info->io.texBindBase = NVE4_CP_INPUT_TEX(0);
          info->io.suInfoBase = NVE4_CP_INPUT_SUF(0);
          info->prop.cp.gridInfoBase = NVE4_CP_INPUT_GRID_INFO(0);
+      } else {
+         info->io.resInfoCBSlot = 15;
       }
       info->io.msInfoCBSlot = 0;
       info->io.msInfoBase = NVE4_CP_INPUT_MS_OFFSETS;
index 86557d73cb202a43b6ebe3c58dc485d1157efbd0..e2a4e4220d157e60145ad57edc8f3c0dbfd40795 100644 (file)
@@ -555,6 +555,8 @@ nvc0_validate_driverconst(struct nvc0_context *nvc0)
       BEGIN_NVC0(push, NVC0_3D(CB_BIND(i)), 1);
       PUSH_DATA (push, (15 << 4) | 1);
    }
+
+   nvc0->dirty_cp |= NVC0_NEW_CP_DRIVERCONST;
 }
 
 void