[Mesa-dev] [PATCH 2/2] winsys/amdgpu: do not iterate twice when adding fence dependencies
Marek Olšák
maraeo at gmail.com
Mon Jan 30 12:09:30 UTC 2017
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Fri, Jan 27, 2017 at 2:35 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> The perf difference is very small, 3.25->2.84% in amdgpu_cs_flush()
> in the DXMD benchmark.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 63 ++++++++++++++++---------------
> 1 file changed, 32 insertions(+), 31 deletions(-)
>
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> index 789a5dbafa..2ce8a6e71c 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> @@ -941,22 +941,6 @@ static void amdgpu_add_fence_dependency(struct amdgpu_cs *acs,
> bo->num_fences = new_num_fences;
> }
>
> -/* Since the kernel driver doesn't synchronize execution between different
> - * rings automatically, we have to add fence dependencies manually.
> - */
> -static void amdgpu_add_fence_dependencies(struct amdgpu_cs *acs)
> -{
> - struct amdgpu_cs_context *cs = acs->csc;
> - int i;
> -
> - cs->request.number_of_dependencies = 0;
> -
> - for (i = 0; i < cs->num_real_buffers; i++)
> - amdgpu_add_fence_dependency(acs, &cs->real_buffers[i]);
> - for (i = 0; i < cs->num_slab_buffers; i++)
> - amdgpu_add_fence_dependency(acs, &cs->slab_buffers[i]);
> -}
> -
> static void amdgpu_add_fence(struct amdgpu_winsys_bo *bo,
> struct pipe_fence_handle *fence)
> {
> @@ -984,6 +968,38 @@ static void amdgpu_add_fence(struct amdgpu_winsys_bo *bo,
> bo->num_fences++;
> }
>
> +/* Since the kernel driver doesn't synchronize execution between different
> + * rings automatically, we have to add fence dependencies manually.
> + */
> +static void amdgpu_add_fence_dependencies(struct amdgpu_cs *acs)
> +{
> + struct amdgpu_cs_context *cs = acs->csc;
> + unsigned num_buffers;
> + int i;
> +
> + cs->request.number_of_dependencies = 0;
> +
> + num_buffers = cs->num_real_buffers;
> + for (i = 0; i < num_buffers; i++) {
> + struct amdgpu_cs_buffer *buffer = &cs->real_buffers[i];
> + struct amdgpu_winsys_bo *bo = buffer->bo;
> +
> + amdgpu_add_fence_dependency(acs, buffer);
> + p_atomic_inc(&bo->num_active_ioctls);
> + amdgpu_add_fence(bo, cs->fence);
> + }
> +
> + num_buffers = cs->num_slab_buffers;
> + for (i = 0; i < num_buffers; i++) {
> + struct amdgpu_cs_buffer *buffer = &cs->slab_buffers[i];
> + struct amdgpu_winsys_bo *bo = buffer->bo;
> +
> + amdgpu_add_fence_dependency(acs, buffer);
> + p_atomic_inc(&bo->num_active_ioctls);
> + amdgpu_add_fence(bo, cs->fence);
> + }
> +}
> +
> void amdgpu_cs_submit_ib(void *job, int thread_index)
> {
> struct amdgpu_cs *acs = (struct amdgpu_cs*)job;
> @@ -1146,7 +1162,6 @@ static int amdgpu_cs_flush(struct radeon_winsys_cs *rcs,
> cs->main.base.current.cdw <= cs->main.base.current.max_dw &&
> !debug_get_option_noop())) {
> struct amdgpu_cs_context *cur = cs->csc;
> - unsigned i, num_buffers;
>
> /* Set IB sizes. */
> amdgpu_ib_finalize(&cs->main);
> @@ -1183,20 +1198,6 @@ static int amdgpu_cs_flush(struct radeon_winsys_cs *rcs,
> pipe_mutex_lock(ws->bo_fence_lock);
> amdgpu_add_fence_dependencies(cs);
>
> - num_buffers = cur->num_real_buffers;
> - for (i = 0; i < num_buffers; i++) {
> - struct amdgpu_winsys_bo *bo = cur->real_buffers[i].bo;
> - p_atomic_inc(&bo->num_active_ioctls);
> - amdgpu_add_fence(bo, cur->fence);
> - }
> -
> - num_buffers = cur->num_slab_buffers;
> - for (i = 0; i < num_buffers; i++) {
> - struct amdgpu_winsys_bo *bo = cur->slab_buffers[i].bo;
> - p_atomic_inc(&bo->num_active_ioctls);
> - amdgpu_add_fence(bo, cur->fence);
> - }
> -
> /* Swap command streams. "cst" is going to be submitted. */
> cs->csc = cs->cst;
> cs->cst = cur;
> --
> 2.11.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list