mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-14 14:00:17 +01:00
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:
parent
54dda2c9f8
commit
1f13dfd1d7
2 changed files with 65 additions and 56 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue