diff --git a/src/freedreno/drm/freedreno_ringbuffer_sp.c b/src/freedreno/drm/freedreno_ringbuffer_sp.c index 3c520236f3f..27f5d8a803d 100644 --- a/src/freedreno/drm/freedreno_ringbuffer_sp.c +++ b/src/freedreno/drm/freedreno_ringbuffer_sp.c @@ -598,6 +598,68 @@ fd_ringbuffer_sp_assert_attached_obj(struct fd_ringbuffer *ring, struct fd_bo *b #endif } +static uint32_t +fd_ringbuffer_sp_attach_ring(struct fd_ringbuffer *ring, + struct fd_ringbuffer *target, + uint32_t cmd_idx, + uint64_t *iova) +{ + struct fd_ringbuffer_sp *fd_target = to_fd_ringbuffer_sp(target); + struct fd_bo *bo; + uint32_t size; + + if ((target->flags & FD_RINGBUFFER_GROWABLE) && + (cmd_idx < fd_target->u.nr_cmds)) { + bo = fd_target->u.cmds[cmd_idx].ring_bo; + size = fd_target->u.cmds[cmd_idx].size; + } else { + bo = fd_target->ring_bo; + size = offset_bytes(target->cur, target->start); + } + + *iova = bo->iova + fd_target->offset; + + if (ring->flags & _FD_RINGBUFFER_OBJECT) { + fd_ringbuffer_sp_attach_bo_obj(ring, bo); + } else { + fd_ringbuffer_sp_attach_bo_nonobj(ring, bo); + } + + if (!(target->flags & _FD_RINGBUFFER_OBJECT)) + return size; + + struct fd_ringbuffer_sp *fd_ring = to_fd_ringbuffer_sp(ring); + + if (ring->flags & _FD_RINGBUFFER_OBJECT) { + for (unsigned i = 0; i < fd_target->u.nr_reloc_bos; i++) { + struct fd_bo *target_bo = fd_target->u.reloc_bos[i]; + if (!fd_ringbuffer_references_bo(ring, target_bo)) + APPEND(&fd_ring->u, reloc_bos, fd_bo_ref(target_bo)); + } + } else { + struct fd_submit_sp *fd_submit = to_fd_submit_sp(fd_ring->u.submit); + + if (fd_submit->seqno != fd_target->u.last_submit_seqno) { + for (unsigned i = 0; i < fd_target->u.nr_reloc_bos; i++) { + fd_submit_append_bo(fd_submit, fd_target->u.reloc_bos[i]); + } + fd_target->u.last_submit_seqno = fd_submit->seqno; + } + +#ifndef NDEBUG + /* Dealing with assert'd BOs is deferred until the submit is known, + * since the batch resource tracking attaches BOs directly to + * the submit instead of the long lived stateobj + */ + for (unsigned i = 0; i < fd_target->u.nr_assert_bos; i++) { + fd_ringbuffer_sp_assert_attached_nonobj(ring, fd_target->u.assert_bos[i]); + } +#endif + } + + return size; +} + #define PTRSZ 64 #include "freedreno_ringbuffer_sp_reloc.h" #undef PTRSZ diff --git a/src/freedreno/drm/freedreno_ringbuffer_sp_reloc.h b/src/freedreno/drm/freedreno_ringbuffer_sp_reloc.h index 68a9c23bc27..8d3d2763c8d 100644 --- a/src/freedreno/drm/freedreno_ringbuffer_sp_reloc.h +++ b/src/freedreno/drm/freedreno_ringbuffer_sp_reloc.h @@ -41,64 +41,11 @@ static void X(fd_ringbuffer_sp_emit_reloc_obj)(struct fd_ringbuffer *ring, static uint32_t X(fd_ringbuffer_sp_emit_reloc_ring)( struct fd_ringbuffer *ring, struct fd_ringbuffer *target, uint32_t cmd_idx) { - struct fd_ringbuffer_sp *fd_target = to_fd_ringbuffer_sp(target); - struct fd_bo *bo; + uint64_t iova; uint32_t size; - if ((target->flags & FD_RINGBUFFER_GROWABLE) && - (cmd_idx < fd_target->u.nr_cmds)) { - bo = fd_target->u.cmds[cmd_idx].ring_bo; - size = fd_target->u.cmds[cmd_idx].size; - } else { - bo = fd_target->ring_bo; - size = offset_bytes(target->cur, target->start); - } - - if (ring->flags & _FD_RINGBUFFER_OBJECT) { - X(fd_ringbuffer_sp_emit_reloc_obj)(ring, &(struct fd_reloc){ - .bo = bo, - .iova = bo->iova + fd_target->offset, - .offset = fd_target->offset, - }); - } else { - X(fd_ringbuffer_sp_emit_reloc_nonobj)(ring, &(struct fd_reloc){ - .bo = bo, - .iova = bo->iova + fd_target->offset, - .offset = fd_target->offset, - }); - } - - if (!(target->flags & _FD_RINGBUFFER_OBJECT)) - return size; - - struct fd_ringbuffer_sp *fd_ring = to_fd_ringbuffer_sp(ring); - - if (ring->flags & _FD_RINGBUFFER_OBJECT) { - for (unsigned i = 0; i < fd_target->u.nr_reloc_bos; i++) { - struct fd_bo *target_bo = fd_target->u.reloc_bos[i]; - if (!fd_ringbuffer_references_bo(ring, target_bo)) - APPEND(&fd_ring->u, reloc_bos, fd_bo_ref(target_bo)); - } - } else { - struct fd_submit_sp *fd_submit = to_fd_submit_sp(fd_ring->u.submit); - - if (fd_submit->seqno != fd_target->u.last_submit_seqno) { - for (unsigned i = 0; i < fd_target->u.nr_reloc_bos; i++) { - fd_submit_append_bo(fd_submit, fd_target->u.reloc_bos[i]); - } - fd_target->u.last_submit_seqno = fd_submit->seqno; - } - -#ifndef NDEBUG - /* Dealing with assert'd BOs is deferred until the submit is known, - * since the batch resource tracking attaches BOs directly to - * the submit instead of the long lived stateobj - */ - for (unsigned i = 0; i < fd_target->u.nr_assert_bos; i++) { - fd_ringbuffer_sp_assert_attached_nonobj(ring, fd_target->u.assert_bos[i]); - } -#endif - } + size = fd_ringbuffer_sp_attach_ring(ring, target, cmd_idx, &iova); + X(emit_reloc_common)(ring, iova); return size; }