freedreno/drm: fix relocs in nested stateobjs
authorRob Clark <robdclark@gmail.com>
Wed, 28 Nov 2018 15:35:32 +0000 (10:35 -0500)
committerRob Clark <robdclark@gmail.com>
Fri, 7 Dec 2018 18:49:21 +0000 (13:49 -0500)
If we have an reloc from stateobjA to stateobjB, we would previously
leave stateobjB's bos out of the submit's bos table.  Handle this case
by copying into stateobjA's reloc_bos table.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/freedreno/drm/msm_ringbuffer_sp.c

index 997ff147659f4f34bf61379804c59159aaea6ba0..8e4e4a5a18ce7d07e799ca2690418e9bb7f5f047 100644 (file)
@@ -451,12 +451,24 @@ msm_ringbuffer_sp_emit_reloc_ring(struct fd_ringbuffer *ring,
                .offset = msm_target->offset,
        });
 
-       if ((target->flags & _FD_RINGBUFFER_OBJECT) &&
-                       !(ring->flags & _FD_RINGBUFFER_OBJECT)) {
+       if (!(target->flags & _FD_RINGBUFFER_OBJECT))
+               return size;
+
+       struct msm_ringbuffer_sp *msm_ring = to_msm_ringbuffer_sp(ring);
+
+       if (ring->flags & _FD_RINGBUFFER_OBJECT) {
+               for (unsigned i = 0; i < msm_target->u.nr_reloc_bos; i++) {
+                       unsigned idx = APPEND(&msm_ring->u, reloc_bos);
+
+                       msm_ring->u.reloc_bos[idx].bo =
+                               fd_bo_ref(msm_target->u.reloc_bos[i].bo);
+                       msm_ring->u.reloc_bos[idx].flags =
+                               msm_target->u.reloc_bos[i].flags;
+               }
+       } else {
                // TODO it would be nice to know whether we have already
                // seen this target before.  But hopefully we hit the
                // append_bo() fast path enough for this to not matter:
-               struct msm_ringbuffer_sp *msm_ring = to_msm_ringbuffer_sp(ring);
                struct msm_submit_sp *msm_submit = to_msm_submit_sp(msm_ring->u.submit);
 
                for (unsigned i = 0; i < msm_target->u.nr_reloc_bos; i++) {