From 10d8e123c5074f9f75efd459d182b3607b02b9a8 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Thu, 24 Jun 2021 16:11:59 -0700 Subject: [PATCH] freedreno: Optimize duplicate obj-obj ring relocs. No need to include the same BO multiple times in the long-lived ringbuffer object's list of relocs to be added to the submit. Improves non-TC drawoverhead -test 9 (8 tex updates) throughput by 1.4901% +/- 0.8705% (n=20) Part-of: --- src/freedreno/drm/msm_ringbuffer_sp.c | 12 ++++++++++++ src/freedreno/drm/msm_ringbuffer_sp.h | 13 ++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/freedreno/drm/msm_ringbuffer_sp.c b/src/freedreno/drm/msm_ringbuffer_sp.c index 145be9ba6fd..62e3a30fb4f 100644 --- a/src/freedreno/drm/msm_ringbuffer_sp.c +++ b/src/freedreno/drm/msm_ringbuffer_sp.c @@ -675,6 +675,18 @@ msm_ringbuffer_sp_grow(struct fd_ringbuffer *ring, uint32_t size) ring->size = size; } +static inline bool +msm_ringbuffer_references_bo(struct fd_ringbuffer *ring, struct fd_bo *bo) +{ + struct msm_ringbuffer_sp *msm_ring = to_msm_ringbuffer_sp(ring); + + for (int i = 0; i < msm_ring->u.nr_reloc_bos; i++) { + if (msm_ring->u.reloc_bos[i] == bo) + return true; + } + return false; +} + #define PTRSZ 64 #include "msm_ringbuffer_sp.h" #undef PTRSZ diff --git a/src/freedreno/drm/msm_ringbuffer_sp.h b/src/freedreno/drm/msm_ringbuffer_sp.h index 1ea6e242785..8b8f61b2c87 100644 --- a/src/freedreno/drm/msm_ringbuffer_sp.h +++ b/src/freedreno/drm/msm_ringbuffer_sp.h @@ -69,14 +69,7 @@ static void X(msm_ringbuffer_sp_emit_reloc_obj)(struct fd_ringbuffer *ring, * relocs per ringbuffer object is fairly small, so the O(n^2) doesn't * hurt much. */ - bool found = false; - for (int i = 0; i < msm_ring->u.nr_reloc_bos; i++) { - if (msm_ring->u.reloc_bos[i] == reloc->bo) { - found = true; - break; - } - } - if (!found) { + if (!msm_ringbuffer_references_bo(ring, reloc->bo)) { APPEND(&msm_ring->u, reloc_bos, fd_bo_ref(reloc->bo)); } } @@ -118,7 +111,9 @@ static uint32_t X(msm_ringbuffer_sp_emit_reloc_ring)( if (ring->flags & _FD_RINGBUFFER_OBJECT) { for (unsigned i = 0; i < msm_target->u.nr_reloc_bos; i++) { - APPEND(&msm_ring->u, reloc_bos, fd_bo_ref(msm_target->u.reloc_bos[i])); + struct fd_bo *target_bo = msm_target->u.reloc_bos[i]; + if (!msm_ringbuffer_references_bo(ring, target_bo)) + APPEND(&msm_ring->u, reloc_bos, fd_bo_ref(target_bo)); } } else { // TODO it would be nice to know whether we have already