From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 31 ++++++++++------------- src/gallium/winsys/amdgpu/drm/amdgpu_cs.h | 1 + 2 files changed, 15 insertions(+), 17 deletions(-)
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index b202ce21cf9..a059a3958d4 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -884,38 +884,40 @@ static void amdgpu_cs_context_cleanup(struct amdgpu_cs_context *cs) } for (i = 0; i < cs->num_slab_buffers; i++) { p_atomic_dec(&cs->slab_buffers[i].bo->num_cs_references); amdgpu_winsys_bo_reference(&cs->slab_buffers[i].bo, NULL); } for (i = 0; i < cs->num_sparse_buffers; i++) { p_atomic_dec(&cs->sparse_buffers[i].bo->num_cs_references); amdgpu_winsys_bo_reference(&cs->sparse_buffers[i].bo, NULL); } cleanup_fence_list(&cs->fence_dependencies); + cleanup_fence_list(&cs->syncobj_dependencies); cleanup_fence_list(&cs->syncobj_to_signal); cs->num_real_buffers = 0; cs->num_slab_buffers = 0; cs->num_sparse_buffers = 0; amdgpu_fence_reference(&cs->fence, NULL); memset(cs->buffer_indices_hashlist, -1, sizeof(cs->buffer_indices_hashlist)); cs->last_added_bo = NULL; } static void amdgpu_destroy_cs_context(struct amdgpu_cs_context *cs) { amdgpu_cs_context_cleanup(cs); FREE(cs->real_buffers); FREE(cs->slab_buffers); FREE(cs->sparse_buffers); FREE(cs->fence_dependencies.list); + FREE(cs->syncobj_dependencies.list); FREE(cs->syncobj_to_signal.list); } static struct radeon_cmdbuf * amdgpu_cs_create(struct radeon_winsys_ctx *rwctx, enum ring_type ring_type, void (*flush)(void *ctx, unsigned flags, struct pipe_fence_handle **fence), void *flush_ctx, @@ -1111,21 +1113,24 @@ static void amdgpu_cs_add_fence_dependency(struct radeon_cmdbuf *rws, { struct amdgpu_cs *acs = amdgpu_cs(rws); struct amdgpu_cs_context *cs = acs->csc; struct amdgpu_fence *fence = (struct amdgpu_fence*)pfence; util_queue_fence_wait(&fence->submitted); if (is_noop_fence_dependency(acs, fence)) return; - add_fence_to_list(&cs->fence_dependencies, fence); + if (amdgpu_fence_is_syncobj(fence)) + add_fence_to_list(&cs->syncobj_dependencies, fence); + else + add_fence_to_list(&cs->fence_dependencies, fence); } static void amdgpu_add_bo_fence_dependencies(struct amdgpu_cs *acs, struct amdgpu_cs_buffer *buffer) { struct amdgpu_cs_context *cs = acs->csc; struct amdgpu_winsys_bo *bo = buffer->bo; unsigned new_num_fences = 0; for (unsigned j = 0; j < bo->num_fences; ++j) { @@ -1360,67 +1365,59 @@ void amdgpu_cs_submit_ib(void *job, int thread_index) num_chunks++; /* Fence */ if (has_user_fence) { chunks[num_chunks].chunk_id = AMDGPU_CHUNK_ID_FENCE; chunks[num_chunks].length_dw = sizeof(struct drm_amdgpu_cs_chunk_fence) / 4; chunks[num_chunks].chunk_data = (uintptr_t)&acs->fence_chunk; num_chunks++; } - /* Dependencies */ + /* Fence dependencies. */ unsigned num_dependencies = cs->fence_dependencies.num; - unsigned num_syncobj_dependencies = 0; - if (num_dependencies) { struct drm_amdgpu_cs_chunk_dep *dep_chunk = alloca(num_dependencies * sizeof(*dep_chunk)); - unsigned num = 0; for (unsigned i = 0; i < num_dependencies; i++) { struct amdgpu_fence *fence = (struct amdgpu_fence*)cs->fence_dependencies.list[i]; - if (amdgpu_fence_is_syncobj(fence)) { - num_syncobj_dependencies++; - continue; - } - assert(util_queue_fence_is_signalled(&fence->submitted)); - amdgpu_cs_chunk_fence_to_dep(&fence->fence, &dep_chunk[num++]); + amdgpu_cs_chunk_fence_to_dep(&fence->fence, &dep_chunk[i]); } chunks[num_chunks].chunk_id = AMDGPU_CHUNK_ID_DEPENDENCIES; - chunks[num_chunks].length_dw = sizeof(dep_chunk[0]) / 4 * num; + chunks[num_chunks].length_dw = sizeof(dep_chunk[0]) / 4 * num_dependencies; chunks[num_chunks].chunk_data = (uintptr_t)dep_chunk; num_chunks++; } /* Syncobj dependencies. */ + unsigned num_syncobj_dependencies = cs->syncobj_dependencies.num; if (num_syncobj_dependencies) { struct drm_amdgpu_cs_chunk_sem *sem_chunk = alloca(num_syncobj_dependencies * sizeof(sem_chunk[0])); - unsigned num = 0; - for (unsigned i = 0; i < num_dependencies; i++) { + for (unsigned i = 0; i < num_syncobj_dependencies; i++) { struct amdgpu_fence *fence = - (struct amdgpu_fence*)cs->fence_dependencies.list[i]; + (struct amdgpu_fence*)cs->syncobj_dependencies.list[i]; if (!amdgpu_fence_is_syncobj(fence)) continue; assert(util_queue_fence_is_signalled(&fence->submitted)); - sem_chunk[num++].handle = fence->syncobj; + sem_chunk[i].handle = fence->syncobj; } chunks[num_chunks].chunk_id = AMDGPU_CHUNK_ID_SYNCOBJ_IN; - chunks[num_chunks].length_dw = sizeof(sem_chunk[0]) / 4 * num; + chunks[num_chunks].length_dw = sizeof(sem_chunk[0]) / 4 * num_syncobj_dependencies; chunks[num_chunks].chunk_data = (uintptr_t)sem_chunk; num_chunks++; } /* Syncobj signals. */ unsigned num_syncobj_to_signal = cs->syncobj_to_signal.num; if (num_syncobj_to_signal) { struct drm_amdgpu_cs_chunk_sem *sem_chunk = alloca(num_syncobj_to_signal * sizeof(sem_chunk[0])); diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h index 60b05910c71..17c0581b6f4 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h @@ -96,20 +96,21 @@ struct amdgpu_cs_context { struct amdgpu_cs_buffer *sparse_buffers; int buffer_indices_hashlist[4096]; struct amdgpu_winsys_bo *last_added_bo; unsigned last_added_bo_index; unsigned last_added_bo_usage; uint32_t last_added_bo_priority_usage; struct amdgpu_fence_list fence_dependencies; + struct amdgpu_fence_list syncobj_dependencies; struct amdgpu_fence_list syncobj_to_signal; struct pipe_fence_handle *fence; /* the error returned from cs_flush for non-async submissions */ int error_code; }; struct amdgpu_cs { struct amdgpu_ib main; /* must be first because this is inherited */ -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev