nvc0: bind shader buffers for compute on Fermi
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 6 Jan 2016 17:46:00 +0000 (18:46 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sun, 21 Feb 2016 09:41:37 +0000 (10:41 +0100)
This is loosely based on 3D. Shader buffers are bound on c15 (the
driver constbuf) at offset 0x200.

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.c

index 2314c5386ca640ab46bd95c6734ea69737b05196..83768a2f6f4b834715d2f1e3b82e7a933ca56e01 100644 (file)
@@ -212,6 +212,38 @@ nvc0_compute_validate_driverconst(struct nvc0_context *nvc0)
    nvc0->dirty |= NVC0_NEW_DRIVERCONST;
 }
 
+static void
+nvc0_compute_validate_buffers(struct nvc0_context *nvc0)
+{
+   struct nouveau_pushbuf *push = nvc0->base.pushbuf;
+   const int s = 5;
+   int i;
+
+   BEGIN_NVC0(push, NVC0_COMPUTE(CB_SIZE), 3);
+   PUSH_DATA (push, 1024);
+   PUSH_DATAh(push, nvc0->screen->uniform_bo->offset + (6 << 16) + (s << 10));
+   PUSH_DATA (push, nvc0->screen->uniform_bo->offset + (6 << 16) + (s << 10));
+   BEGIN_1IC0(push, NVC0_COMPUTE(CB_POS), 1 + 4 * NVC0_MAX_BUFFERS);
+   PUSH_DATA (push, 512);
+
+   for (i = 0; i < NVC0_MAX_BUFFERS; i++) {
+      if (nvc0->buffers[s][i].buffer) {
+         struct nv04_resource *res =
+            nv04_resource(nvc0->buffers[s][i].buffer);
+         PUSH_DATA (push, res->address + nvc0->buffers[s][i].buffer_offset);
+         PUSH_DATAh(push, res->address + nvc0->buffers[s][i].buffer_offset);
+         PUSH_DATA (push, nvc0->buffers[s][i].buffer_size);
+         PUSH_DATA (push, 0);
+         BCTX_REFN(nvc0->bufctx_cp, CP_BUF, res, RDWR);
+      } else {
+         PUSH_DATA (push, 0);
+         PUSH_DATA (push, 0);
+         PUSH_DATA (push, 0);
+         PUSH_DATA (push, 0);
+      }
+   }
+}
+
 static bool
 nvc0_compute_state_validate(struct nvc0_context *nvc0)
 {
@@ -221,6 +253,8 @@ nvc0_compute_state_validate(struct nvc0_context *nvc0)
       nvc0_compute_validate_constbufs(nvc0);
    if (nvc0->dirty_cp & NVC0_NEW_CP_DRIVERCONST)
       nvc0_compute_validate_driverconst(nvc0);
+   if (nvc0->dirty_cp & NVC0_NEW_CP_BUFFERS)
+      nvc0_compute_validate_buffers(nvc0);
 
    /* TODO: textures, samplers, surfaces, global memory buffers */
 
index 3d2ed75e03afdd51bfbcb2938d762a6a957e60ce..66e7f95c2e47fa0f545342a9cecc71c1c480b7cf 100644 (file)
@@ -261,12 +261,17 @@ nvc0_invalidate_resource_storage(struct nouveau_context *ctx,
       }
       }
 
-      for (s = 0; s < 5; ++s) {
+      for (s = 0; s < 6; ++s) {
       for (i = 0; i < NVC0_MAX_BUFFERS; ++i) {
          if (nvc0->buffers[s][i].buffer == res) {
             nvc0->buffers_dirty[s] |= 1 << i;
-            nvc0->dirty |= NVC0_NEW_BUFFERS;
-            nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_BUF);
+            if (unlikely(s == 5)) {
+               nvc0->dirty_cp |= NVC0_NEW_CP_BUFFERS;
+               nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_BUF);
+            } else {
+               nvc0->dirty |= NVC0_NEW_BUFFERS;
+               nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_BUF);
+            }
             if (!--ref)
                return ref;
          }
index 86116a07f85b8766464fd43bf7534226fb21b16d..2b5ab7321d87f6f00ade7e02f48910bf0dd538cc 100644 (file)
@@ -66,6 +66,7 @@
 #define NVC0_NEW_CP_CONSTBUF  (1 << 4)
 #define NVC0_NEW_CP_GLOBALS   (1 << 5)
 #define NVC0_NEW_CP_DRIVERCONST (1 << 6)
+#define NVC0_NEW_CP_BUFFERS   (1 << 7)
 
 /* 3d bufctx (during draw_vbo, blit_3d) */
 #define NVC0_BIND_FB            0
@@ -89,7 +90,8 @@
 #define NVC0_BIND_CP_DESC        50
 #define NVC0_BIND_CP_SCREEN      51
 #define NVC0_BIND_CP_QUERY       52
-#define NVC0_BIND_CP_COUNT       53
+#define NVC0_BIND_CP_BUF         53
+#define NVC0_BIND_CP_COUNT       54
 
 /* bufctx for other operations */
 #define NVC0_BIND_2D            0
index afcff5371477c2d2416e5460c5f4e32a671473ec..bc884d6c08f4c30e73b9d3f7a3202e8a4e5e5b76 100644 (file)
@@ -546,6 +546,7 @@ nvc0_program_translate(struct nvc0_program *prog, uint16_t chipset,
          info->prop.cp.gridInfoBase = NVE4_CP_INPUT_GRID_INFO(0);
       } else {
          info->io.resInfoCBSlot = 15;
+         info->io.suInfoBase = 512;
       }
       info->io.msInfoCBSlot = 0;
       info->io.msInfoBase = NVE4_CP_INPUT_MS_OFFSETS;
index 157d628d8490fe2f8bf0ed856783cf8e58a5a269..9391ad6ec100b067ceffd489edccb09c98aa4588 100644 (file)
@@ -1245,7 +1245,7 @@ nvc0_bind_buffers_range(struct nvc0_context *nvc0, const unsigned t,
    const unsigned mask = ((1 << nr) - 1) << start;
    unsigned i;
 
-   assert(t < 5);
+   assert(t < 6);
 
    if (pbuffers) {
       for (i = start; i < end; ++i) {
@@ -1265,7 +1265,11 @@ nvc0_bind_buffers_range(struct nvc0_context *nvc0, const unsigned t,
    }
    nvc0->buffers_dirty[t] |= mask;
 
-   nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_BUF);
+   if (t == 5)
+      nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_BUF);
+   else
+      nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_BUF);
+
 }
 
 static void
@@ -1277,7 +1281,10 @@ nvc0_set_shader_buffers(struct pipe_context *pipe,
    const unsigned s = nvc0_shader_stage(shader);
    nvc0_bind_buffers_range(nvc0_context(pipe), s, start, nr, buffers);
 
-   nvc0_context(pipe)->dirty |= NVC0_NEW_BUFFERS;
+   if (s == 5)
+      nvc0_context(pipe)->dirty_cp |= NVC0_NEW_CP_BUFFERS;
+   else
+      nvc0_context(pipe)->dirty |= NVC0_NEW_BUFFERS;
 }
 
 static inline void