Mesa (master): freedreno/drm: fix relocs in nested stateobjs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 7 18:50:40 UTC 2018


Module: Mesa
Branch: master
Commit: e779725f0b4bf50ab700cc000ed928b94d21c18f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e779725f0b4bf50ab700cc000ed928b94d21c18f

Author: Rob Clark <robdclark at gmail.com>
Date:   Wed Nov 28 10:35:32 2018 -0500

freedreno/drm: fix relocs in nested stateobjs

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 at gmail.com>

---

 src/freedreno/drm/msm_ringbuffer_sp.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/freedreno/drm/msm_ringbuffer_sp.c b/src/freedreno/drm/msm_ringbuffer_sp.c
index 997ff14765..8e4e4a5a18 100644
--- a/src/freedreno/drm/msm_ringbuffer_sp.c
+++ b/src/freedreno/drm/msm_ringbuffer_sp.c
@@ -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++) {




More information about the mesa-commit mailing list