freedreno/drm: Split out sp_attach_ring()

Split the attach and emit, to prepare for exposing attach_ring() in the
drm interface.

Signed-off-by: Rob Clark <rob.clark@oss.qualcomm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36589>
This commit is contained in:
Rob Clark 2025-08-02 07:45:26 -07:00 committed by Marge Bot
parent 54dda2c9f8
commit 1f13dfd1d7
2 changed files with 65 additions and 56 deletions

View file

@ -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

View file

@ -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;
}