Mesa (master): winsys/amdgpu: add amdgpu_cs::ws to reduce dereferences

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Apr 6 22:53:21 UTC 2021


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Tue Mar 23 20:38:48 2021 -0400

winsys/amdgpu: add amdgpu_cs::ws to reduce dereferences

Reviewed-by: Zoltán Böszörményi <zboszor at gmail.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9809>

---

 src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 37 ++++++++++++++++---------------
 src/gallium/winsys/amdgpu/drm/amdgpu_cs.h |  1 +
 2 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index 36c15fd3542..bde2508847f 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -396,7 +396,7 @@ static bool amdgpu_cs_has_user_fence(struct amdgpu_cs_context *cs)
 
 static bool amdgpu_cs_has_chaining(struct amdgpu_cs *cs)
 {
-   return cs->ctx->ws->info.chip_class >= GFX7 &&
+   return cs->ws->info.chip_class >= GFX7 &&
           (cs->ring_type == RING_GFX || cs->ring_type == RING_COMPUTE);
 }
 
@@ -506,7 +506,7 @@ amdgpu_lookup_or_add_real_buffer(struct radeon_cmdbuf *rcs, struct amdgpu_cs *ac
    if (idx >= 0)
       return idx;
 
-   idx = amdgpu_do_add_real_buffer(acs->ctx->ws, cs, bo);
+   idx = amdgpu_do_add_real_buffer(acs->ws, cs, bo);
 
    hash = bo->unique_id & (ARRAY_SIZE(cs->buffer_indices_hashlist)-1);
    cs->buffer_indices_hashlist[hash] = idx;
@@ -653,7 +653,7 @@ static unsigned amdgpu_cs_add_buffer(struct radeon_cmdbuf *rcs,
 
    if (!(bo->base.usage & RADEON_FLAG_SPARSE)) {
       if (!bo->bo) {
-         index = amdgpu_lookup_or_add_slab_buffer(acs->ctx->ws, rcs, acs, bo);
+         index = amdgpu_lookup_or_add_slab_buffer(acs->ws, rcs, acs, bo);
          if (index < 0)
             return 0;
 
@@ -670,7 +670,7 @@ static unsigned amdgpu_cs_add_buffer(struct radeon_cmdbuf *rcs,
 
       buffer = &cs->real_buffers[index];
    } else {
-      index = amdgpu_lookup_or_add_sparse_buffer(acs->ctx->ws, rcs, acs, bo);
+      index = amdgpu_lookup_or_add_sparse_buffer(acs->ws, rcs, acs, bo);
       if (index < 0)
          return 0;
 
@@ -970,6 +970,7 @@ amdgpu_cs_create(struct radeon_cmdbuf *rcs,
 
    util_queue_fence_init(&cs->flush_completed);
 
+   cs->ws = ctx->ws;
    cs->ctx = ctx;
    cs->flush_cs = flush;
    cs->flush_data = flush_ctx;
@@ -1021,7 +1022,7 @@ amdgpu_cs_add_parallel_compute_ib(struct radeon_cmdbuf *compute_cs,
                                   bool uses_gds_ordered_append)
 {
    struct amdgpu_cs *cs = amdgpu_cs(gfx_cs);
-   struct amdgpu_winsys *ws = cs->ctx->ws;
+   struct amdgpu_winsys *ws = cs->ws;
 
    if (cs->ring_type != RING_GFX)
       return false;
@@ -1051,7 +1052,7 @@ amdgpu_cs_setup_preemption(struct radeon_cmdbuf *rcs, const uint32_t *preamble_i
                            unsigned preamble_num_dw)
 {
    struct amdgpu_cs *cs = amdgpu_cs(rcs);
-   struct amdgpu_winsys *ws = cs->ctx->ws;
+   struct amdgpu_winsys *ws = cs->ws;
    struct amdgpu_cs_context *csc[2] = {&cs->csc1, &cs->csc2};
    unsigned size = align(preamble_num_dw * 4, ws->info.ib_alignment);
    struct pb_buffer *preamble_bo;
@@ -1153,7 +1154,7 @@ static bool amdgpu_cs_check_space(struct radeon_cmdbuf *rcs, unsigned dw,
       rcs->max_prev = new_max_prev;
    }
 
-   if (!amdgpu_ib_new_buffer(cs->ctx->ws, ib, cs))
+   if (!amdgpu_ib_new_buffer(cs->ws, ib, cs))
       return false;
 
    assert(ib->used_ib_space == 0);
@@ -1163,7 +1164,7 @@ static bool amdgpu_cs_check_space(struct radeon_cmdbuf *rcs, unsigned dw,
    rcs->current.max_dw += cs_epilog_dw;
 
    /* Pad with NOPs but leave 4 dwords for INDIRECT_BUFFER. */
-   uint32_t ib_pad_dw_mask = cs->ctx->ws->info.ib_pad_dw_mask[cs->ring_type];
+   uint32_t ib_pad_dw_mask = cs->ws->info.ib_pad_dw_mask[cs->ring_type];
    while ((rcs->current.cdw & ib_pad_dw_mask) != ib_pad_dw_mask - 3)
       radeon_emit(rcs, PKT3_NOP_PAD);
 
@@ -1246,7 +1247,7 @@ static bool is_noop_fence_dependency(struct amdgpu_cs *acs,
     * we need the parallelism between IBs for good performance.
     */
    if ((acs->ring_type == RING_GFX ||
-        acs->ctx->ws->info.num_rings[acs->ring_type] == 1) &&
+        acs->ws->info.num_rings[acs->ring_type] == 1) &&
        !amdgpu_fence_is_syncobj(fence) &&
        fence->ctx == acs->ctx &&
        fence->fence.ip_type == cs->ib[IB_MAIN].ip_type &&
@@ -1271,7 +1272,7 @@ static void amdgpu_cs_add_fence_dependency(struct radeon_cmdbuf *rws,
       /* Syncobjs are not needed here. */
       assert(!amdgpu_fence_is_syncobj(fence));
 
-      if (acs->ctx->ws->info.has_scheduled_fence_dependency &&
+      if (acs->ws->info.has_scheduled_fence_dependency &&
           dependency_flags & RADEON_DEPENDENCY_START_FENCE)
          add_fence_to_list(&cs->compute_start_fence_dependencies, fence);
       else
@@ -1434,7 +1435,7 @@ static bool amdgpu_add_sparse_backing_buffers(struct amdgpu_winsys *ws,
 static void amdgpu_cs_submit_ib(void *job, int thread_index)
 {
    struct amdgpu_cs *acs = (struct amdgpu_cs*)job;
-   struct amdgpu_winsys *ws = acs->ctx->ws;
+   struct amdgpu_winsys *ws = acs->ws;
    struct amdgpu_cs_context *cs = acs->cst;
    int i, r;
    uint32_t bo_list = 0;
@@ -1748,7 +1749,7 @@ static int amdgpu_cs_flush(struct radeon_cmdbuf *rcs,
                            struct pipe_fence_handle **fence)
 {
    struct amdgpu_cs *cs = amdgpu_cs(rcs);
-   struct amdgpu_winsys *ws = cs->ctx->ws;
+   struct amdgpu_winsys *ws = cs->ws;
    int error_code = 0;
    uint32_t ib_pad_dw_mask = ws->info.ib_pad_dw_mask[cs->ring_type];
 
@@ -1901,15 +1902,15 @@ static void amdgpu_cs_destroy(struct radeon_cmdbuf *rcs)
 
    amdgpu_cs_sync_flush(rcs);
    util_queue_fence_destroy(&cs->flush_completed);
-   p_atomic_dec(&cs->ctx->ws->num_cs);
-   radeon_bo_reference(&cs->ctx->ws->dummy_ws.base, &cs->preamble_ib_bo, NULL);
-   radeon_bo_reference(&cs->ctx->ws->dummy_ws.base, &cs->main.big_ib_buffer, NULL);
+   p_atomic_dec(&cs->ws->num_cs);
+   radeon_bo_reference(&cs->ws->dummy_ws.base, &cs->preamble_ib_bo, NULL);
+   radeon_bo_reference(&cs->ws->dummy_ws.base, &cs->main.big_ib_buffer, NULL);
    FREE(rcs->prev);
-   radeon_bo_reference(&cs->ctx->ws->dummy_ws.base, &cs->compute_ib.big_ib_buffer, NULL);
+   radeon_bo_reference(&cs->ws->dummy_ws.base, &cs->compute_ib.big_ib_buffer, NULL);
    if (cs->compute_ib.rcs)
       FREE(cs->compute_ib.rcs->prev);
-   amdgpu_destroy_cs_context(cs->ctx->ws, &cs->csc1);
-   amdgpu_destroy_cs_context(cs->ctx->ws, &cs->csc2);
+   amdgpu_destroy_cs_context(cs->ws, &cs->csc1);
+   amdgpu_destroy_cs_context(cs->ws, &cs->csc2);
    amdgpu_fence_reference(&cs->next_fence, NULL);
    FREE(cs);
 }
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
index e44c74fed2a..cfd80a5c564 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
@@ -131,6 +131,7 @@ struct amdgpu_cs_context {
 struct amdgpu_cs {
    struct amdgpu_ib main; /* must be first because this is inherited */
    struct amdgpu_ib compute_ib;      /* optional parallel compute IB */
+   struct amdgpu_winsys *ws;
    struct amdgpu_ctx *ctx;
    enum ring_type ring_type;
    struct drm_amdgpu_cs_chunk_fence fence_chunk;



More information about the mesa-commit mailing list