nv50,nvc0: use new scratch buffers code
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 1 Mar 2012 20:28:29 +0000 (21:28 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 14 Apr 2012 04:14:21 +0000 (06:14 +0200)
src/gallium/drivers/nv50/nv50_context.c
src/gallium/drivers/nv50/nv50_screen.h
src/gallium/drivers/nv50/nv50_vbo.c
src/gallium/drivers/nvc0/nvc0_context.c
src/gallium/drivers/nvc0/nvc0_context.h
src/gallium/drivers/nvc0/nvc0_screen.c
src/gallium/drivers/nvc0/nvc0_screen.h
src/gallium/drivers/nvc0/nvc0_vbo.c

index 96ada551b308ad288220ed444ef8326a63a66544..8651be01c5c66ddea589fdfbe07704712b3f3c20 100644 (file)
@@ -175,6 +175,8 @@ nv50_create(struct pipe_screen *pscreen, void *priv)
    BCTX_REFN_bo(nv50->bufctx_3d, SCREEN, flags, screen->fence.bo);
    BCTX_REFN_bo(nv50->bufctx, FENCE, flags, screen->fence.bo);
 
+   nv50->base.scratch.bo_size = 2 << 20;
+
    return pipe;
 
 out_err:
index b7803cfed80e46ea269663666319f804a199cba5..9eae08ea1d359c5cefd6a176157dbfbd61a87b86 100644 (file)
@@ -16,9 +16,6 @@ struct nv50_context;
 
 #define NV50_CODE_BO_SIZE_LOG2 19
 
-#define NV50_SCRATCH_SIZE (2 << 20)
-#define NV50_SCRATCH_NR_BUFFERS 2
-
 #define NV50_SCREEN_RESIDENT_BO_COUNT 5
 
 struct nv50_blitctx;
index 9be43ef15d4a798f840d9f3ba292d37c4a488deb..b9f352d7df82c22e81641b55b895a0f8d88524dc 100644 (file)
@@ -186,6 +186,8 @@ nv50_vbuf_range(struct nv50_context *nv50, int vbi,
 static void
 nv50_prevalidate_vbufs(struct nv50_context *nv50)
 {
+   const uint32_t bo_flags = NOUVEAU_BO_RD | NOUVEAU_BO_GART;
+   struct nouveau_bo *bo;
    struct pipe_vertex_buffer *vb;
    struct nv04_resource *buf;
    int i;
@@ -201,47 +203,48 @@ nv50_prevalidate_vbufs(struct nv50_context *nv50)
          continue;
       buf = nv04_resource(vb->buffer);
 
-      /* NOTE: user buffers with temporary storage count as mapped by GPU */
-      if (!nouveau_resource_mapped_by_gpu(vb->buffer)) {
+      if (nouveau_resource_mapped_by_gpu(vb->buffer)) {
+         BCTX_REFN(nv50->bufctx_3d, VERTEX, buf, RD);
+      } else {
          if (nv50->vbo_push_hint) {
             nv50->vbo_fifo = ~0;
-            continue;
+            return;
+         }
+         nv50->base.vbo_dirty = TRUE;
+
+         if (buf->status & NOUVEAU_BUFFER_STATUS_USER_MEMORY) {
+            assert(vb->stride > vb->buffer_offset);
+            nv50->vbo_user |= 1 << i;
+            nv50_vbuf_range(nv50, i, &base, &size);
+            bo = nouveau_scratch_data(&nv50->base, buf, base, size);
+            if (bo)
+               BCTX_REFN_bo(nv50->bufctx_3d, VERTEX_TMP, bo_flags, bo);
          } else {
-            if (buf->status & NOUVEAU_BUFFER_STATUS_USER_MEMORY) {
-               nv50->vbo_user |= 1 << i;
-               assert(vb->stride > vb->buffer_offset);
-               nv50_vbuf_range(nv50, i, &base, &size);
-               nouveau_user_buffer_upload(&nv50->base, buf, base, size);
-            } else {
-               nouveau_buffer_migrate(&nv50->base, buf, NOUVEAU_BO_GART);
-            }
-            nv50->base.vbo_dirty = TRUE;
+            if (nouveau_buffer_migrate(&nv50->base, buf, NOUVEAU_BO_GART))
+               BCTX_REFN(nv50->bufctx_3d, VERTEX, buf, RD);
          }
       }
-      BCTX_REFN(nv50->bufctx_3d, VERTEX, buf, RD);
    }
 }
 
 static void
 nv50_update_user_vbufs(struct nv50_context *nv50)
 {
+   const uint32_t bo_flags = NOUVEAU_BO_RD | NOUVEAU_BO_GART;
+   struct nouveau_bo *bo;
    struct nouveau_pushbuf *push = nv50->base.pushbuf;
    uint32_t base, offset, size;
    int i;
    uint32_t written = 0;
 
-   nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_VERTEX);
-
    for (i = 0; i < nv50->vertex->num_elements; ++i) {
       struct pipe_vertex_element *ve = &nv50->vertex->element[i].pipe;
       const int b = ve->vertex_buffer_index;
       struct pipe_vertex_buffer *vb = &nv50->vtxbuf[b];
       struct nv04_resource *buf = nv04_resource(vb->buffer);
 
-      if (!(nv50->vbo_user & (1 << b))) {
-         BCTX_REFN(nv50->bufctx_3d, VERTEX, buf, RD);
+      if (!(nv50->vbo_user & (1 << b)))
          continue;
-      }
 
       if (!vb->stride) {
          nv50_emit_vtxattr(nv50, vb, ve, i);
@@ -251,7 +254,9 @@ nv50_update_user_vbufs(struct nv50_context *nv50)
 
       if (!(written & (1 << b))) {
          written |= 1 << b;
-         nouveau_user_buffer_upload(&nv50->base, buf, base, size);
+         bo = nouveau_scratch_data(&nv50->base, buf, base, size);
+         if (bo)
+            BCTX_REFN_bo(nv50->bufctx_3d, VERTEX_TMP, bo_flags, bo);
       }
       offset = vb->buffer_offset + ve->src_offset;
 
@@ -261,8 +266,6 @@ nv50_update_user_vbufs(struct nv50_context *nv50)
       BEGIN_NV04(push, NV50_3D(VERTEX_ARRAY_START_HIGH(i)), 2);
       PUSH_DATAh(push, buf->address + offset);
       PUSH_DATA (push, buf->address + offset);
-
-      BCTX_REFN(nv50->bufctx_3d, VERTEX, buf, RD);
    }
    nv50->base.vbo_dirty = TRUE;
 }
@@ -270,13 +273,9 @@ nv50_update_user_vbufs(struct nv50_context *nv50)
 static INLINE void
 nv50_release_user_vbufs(struct nv50_context *nv50)
 {
-   uint32_t vbo_user = nv50->vbo_user;
-
-   while (vbo_user) {
-      int i = ffs(vbo_user) - 1;
-      vbo_user &= ~(1 << i);
-
-      nouveau_buffer_release_gpu_storage(nv04_resource(nv50->vtxbuf[i].buffer));
+   if (nv50->vbo_user) {
+      nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_VERTEX_TMP);
+      nouveau_scratch_done(&nv50->base);
    }
 }
 
index 471c7be77e0fe4fd1c2aa5b694c35cffe92a2c49..461ceb14c45eeb4246f471f1ab41a864fedcaf8a 100644 (file)
@@ -182,6 +182,8 @@ nvc0_create(struct pipe_screen *pscreen, void *priv)
    BCTX_REFN_bo(nvc0->bufctx_3d, SCREEN, flags, screen->fence.bo);
    BCTX_REFN_bo(nvc0->bufctx, FENCE, flags, screen->fence.bo);
 
+   nvc0->base.scratch.bo_size = 2 << 20;
+
    return pipe;
 
 out_err:
index 7342a6e664f6f438f777aa3d8853a106473f146f..f6a505587acddd6eade6d3e0814fe1b7012e34a1 100644 (file)
 
 #define NVC0_BIND_FB          0
 #define NVC0_BIND_VTX         1
-#define NVC0_BIND_IDX         2
-#define NVC0_BIND_TEX         3
-#define NVC0_BIND_CB(s, i)   (4 + 16 * (s) + (i))
-#define NVC0_BIND_TFB         84
-#define NVC0_BIND_SCREEN      85
-#define NVC0_BIND_TLS         86
-#define NVC0_BIND_COUNT       87
+#define NVC0_BIND_VTX_TMP     2
+#define NVC0_BIND_IDX         3
+#define NVC0_BIND_TEX         4
+#define NVC0_BIND_CB(s, i)   (5 + 16 * (s) + (i))
+#define NVC0_BIND_TFB         85
+#define NVC0_BIND_SCREEN      86
+#define NVC0_BIND_TLS         87
+#define NVC0_BIND_COUNT       88
 #define NVC0_BIND_2D          0
 #define NVC0_BIND_M2MF        0
 #define NVC0_BIND_FENCE       1
index 94a16b5068c058187bf9b9682768be675bc454e1..52cc00134c03670cc0e6577c2b62e04be4356ae7 100644 (file)
@@ -431,13 +431,6 @@ nvc0_screen_create(struct nouveau_device *dev)
    screen->base.fence.emit = nvc0_screen_fence_emit;
    screen->base.fence.update = nvc0_screen_fence_update;
 
-   for (i = 0; i < NVC0_SCRATCH_NR_BUFFERS; ++i) {
-      ret = nouveau_bo_new(dev, NOUVEAU_BO_GART, 0, NVC0_SCRATCH_SIZE, NULL,
-                           &screen->scratch.bo[i]);
-      if (ret)
-         goto fail;
-   }
-
    ret = nouveau_object_new(chan, 0xbeef9039, NVC0_M2MF_CLASS, NULL, 0,
                             &screen->m2mf);
    if (ret)
index 9abf4b1fd3dcd6e85a5887ff71b05cebb64ec178..e0f5e5ec2460930b60612ff19e3d6b87ca8465db 100644 (file)
 
 struct nvc0_context;
 
-#define NVC0_SCRATCH_SIZE (2 << 20)
-#define NVC0_SCRATCH_NR_BUFFERS 2
-
-#define NVC0_SCREEN_RESIDENT_BO_COUNT 5
-
 struct nvc0_blitctx;
 
 struct nvc0_screen {
@@ -41,13 +36,6 @@ struct nvc0_screen {
 
    struct nvc0_blitctx *blitctx;
 
-   struct {
-      struct nouveau_bo *bo[NVC0_SCRATCH_NR_BUFFERS];
-      uint8_t *buf;
-      int index;
-      uint32_t offset;
-   } scratch;
-
    struct {
       void **entries;
       int next;
index fbdc5d25d58488ebf39e83cf3c340ccff169684b..9c13adff80704b9a1b885fc7a990db97eb29785e 100644 (file)
@@ -167,6 +167,8 @@ nvc0_vbuf_range(struct nvc0_context *nvc0, int vbi,
 static void
 nvc0_prevalidate_vbufs(struct nvc0_context *nvc0)
 {
+   const uint32_t bo_flags = NOUVEAU_BO_RD | NOUVEAU_BO_GART;
+   struct nouveau_bo *bo;
    struct pipe_vertex_buffer *vb;
    struct nv04_resource *buf;
    int i;
@@ -182,21 +184,23 @@ nvc0_prevalidate_vbufs(struct nvc0_context *nvc0)
          continue;
       buf = nv04_resource(vb->buffer);
 
-      /* NOTE: user buffers with temporary storage count as mapped by GPU */
       if (!nouveau_resource_mapped_by_gpu(vb->buffer)) {
          if (nvc0->vbo_push_hint) {
             nvc0->vbo_fifo = ~0;
+            return;
+         }
+         nvc0->base.vbo_dirty = TRUE;
+
+         if (buf->status & NOUVEAU_BUFFER_STATUS_USER_MEMORY) {
+            assert(vb->stride > vb->buffer_offset);
+            nvc0->vbo_user |= 1 << i;
+            nvc0_vbuf_range(nvc0, i, &base, &size);
+            bo = nouveau_scratch_data(&nvc0->base, buf, base, size);
+            if (bo)
+               BCTX_REFN_bo(nvc0->bufctx_3d, VTX_TMP, bo_flags, bo);
             continue;
          } else {
-            if (buf->status & NOUVEAU_BUFFER_STATUS_USER_MEMORY) {
-               nvc0->vbo_user |= 1 << i;
-               assert(vb->stride > vb->buffer_offset);
-               nvc0_vbuf_range(nvc0, i, &base, &size);
-               nouveau_user_buffer_upload(&nvc0->base, buf, base, size);
-            } else {
-               nouveau_buffer_migrate(&nvc0->base, buf, NOUVEAU_BO_GART);
-            }
-            nvc0->base.vbo_dirty = TRUE;
+            nouveau_buffer_migrate(&nvc0->base, buf, NOUVEAU_BO_GART);
          }
       }
       BCTX_REFN(nvc0->bufctx_3d, VTX, buf, RD);
@@ -206,15 +210,13 @@ nvc0_prevalidate_vbufs(struct nvc0_context *nvc0)
 static void
 nvc0_update_user_vbufs(struct nvc0_context *nvc0)
 {
+   const uint32_t bo_flags = NOUVEAU_BO_RD | NOUVEAU_BO_GART;
+   struct nouveau_bo *bo;
    struct nouveau_pushbuf *push = nvc0->base.pushbuf;
    uint32_t base, offset, size;
    int i;
    uint32_t written = 0;
 
-   /* TODO: use separate bufctx bin for user buffers
-    */
-   nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_VTX);
-
    PUSH_SPACE(push, nvc0->vertex->num_elements * 8);
 
    for (i = 0; i < nvc0->vertex->num_elements; ++i) {
@@ -223,10 +225,8 @@ nvc0_update_user_vbufs(struct nvc0_context *nvc0)
       struct pipe_vertex_buffer *vb = &nvc0->vtxbuf[b];
       struct nv04_resource *buf = nv04_resource(vb->buffer);
 
-      if (!(nvc0->vbo_user & (1 << b))) {
-         BCTX_REFN(nvc0->bufctx_3d, VTX, buf, RD);
+      if (!(nvc0->vbo_user & (1 << b)))
          continue;
-      }
 
       if (!vb->stride) {
          nvc0_emit_vtxattr(nvc0, vb, ve, i);
@@ -236,7 +236,9 @@ nvc0_update_user_vbufs(struct nvc0_context *nvc0)
 
       if (!(written & (1 << b))) {
          written |= 1 << b;
-         nouveau_user_buffer_upload(&nvc0->base, buf, base, size);
+         bo = nouveau_scratch_data(&nvc0->base, buf, base, size);
+         if (bo)
+            BCTX_REFN_bo(nvc0->bufctx_3d, VTX_TMP, bo_flags, bo);
       }
       offset = vb->buffer_offset + ve->src_offset;
 
@@ -246,8 +248,6 @@ nvc0_update_user_vbufs(struct nvc0_context *nvc0)
       PUSH_DATA (push, buf->address + base + size - 1);
       PUSH_DATAh(push, buf->address + offset);
       PUSH_DATA (push, buf->address + offset);
-
-      BCTX_REFN(nvc0->bufctx_3d, VTX, buf, RD);
    }
    nvc0->base.vbo_dirty = TRUE;
 }
@@ -255,13 +255,9 @@ nvc0_update_user_vbufs(struct nvc0_context *nvc0)
 static INLINE void
 nvc0_release_user_vbufs(struct nvc0_context *nvc0)
 {
-   uint32_t vbo_user = nvc0->vbo_user;
-
-   while (vbo_user) {
-      int i = ffs(vbo_user) - 1;
-      vbo_user &= ~(1 << i);
-
-      nouveau_buffer_release_gpu_storage(nv04_resource(nvc0->vtxbuf[i].buffer));
+   if (nvc0->vbo_user) {
+      nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_VTX_TMP);
+      nouveau_scratch_done(&nvc0->base);
    }
 }