Mesa (amdgpu): Revert "winsys/amdgpu: use amdgpu_bo_wait_for_idle"

Alex Deucher agd5f at kemper.freedesktop.org
Thu May 28 05:09:07 UTC 2015


Module: Mesa
Branch: amdgpu
Commit: 6b7f81f654fa627157a91e1bc5b59f7b63726d3d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6b7f81f654fa627157a91e1bc5b59f7b63726d3d

Author: Leo Liu <leo.liu at amd.com>
Date:   Fri May 22 09:20:49 2015 -0400

Revert "winsys/amdgpu: use amdgpu_bo_wait_for_idle"

This reverts commit 3691c11ace4a0e7b2307dbf047048d363803d387.

This cause HW transcode performance drop 30%, revert it for now.

Acked-by: Marek Olšák <marek.olsak at amd.com>

---

 src/gallium/winsys/amdgpu/drm/amdgpu_bo.c |   14 +++++++-------
 src/gallium/winsys/amdgpu/drm/amdgpu_bo.h |    2 ++
 src/gallium/winsys/amdgpu/drm/amdgpu_cs.c |    4 ++++
 3 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
index 06858d3..b274536 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
@@ -76,29 +76,28 @@ static struct amdgpu_winsys_bo *get_amdgpu_winsys_bo(struct pb_buffer *_buf)
 static void amdgpu_bo_wait(struct pb_buffer *_buf, enum radeon_bo_usage usage)
 {
    struct amdgpu_winsys_bo *bo = get_amdgpu_winsys_bo(_buf);
-   bool busy;
+   struct radeon_winsys *ws = &bo->rws->base;
 
    while (p_atomic_read(&bo->num_active_ioctls)) {
       sched_yield();
    }
 
-   amdgpu_bo_wait_for_idle(bo->bo, AMDGPU_TIMEOUT_INFINITE, &busy);
+   if (bo->fence) {
+      ws->fence_wait(ws, bo->fence, PIPE_TIMEOUT_INFINITE);
+   }
 }
 
 static boolean amdgpu_bo_is_busy(struct pb_buffer *_buf,
                                  enum radeon_bo_usage usage)
 {
    struct amdgpu_winsys_bo *bo = get_amdgpu_winsys_bo(_buf);
-   bool busy;
+   struct radeon_winsys *ws = &bo->rws->base;
 
    if (p_atomic_read(&bo->num_active_ioctls)) {
       return TRUE;
    }
 
-   if (amdgpu_bo_wait_for_idle(bo->bo, 0, &busy))
-      return false;
-
-   return busy;
+   return bo->fence && !ws->fence_wait(ws, bo->fence, 0);
 }
 
 static enum radeon_bo_domain amdgpu_bo_get_initial_domain(
@@ -112,6 +111,7 @@ static void amdgpu_bo_destroy(struct pb_buffer *_buf)
    struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(_buf);
 
    amdgpu_bo_free(bo->bo);
+   amdgpu_fence_reference(&bo->fence, NULL);
 
    if (bo->initial_domain & RADEON_DOMAIN_VRAM)
       bo->rws->allocated_vram -= align(bo->base.size, 4096);
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
index f708731..77c0520 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
@@ -60,6 +60,8 @@ struct amdgpu_winsys_bo {
    /* how many command streams, which are being emitted in a separate
     * thread, is this bo referenced in? */
    int num_active_ioctls;
+
+   struct pipe_fence_handle *fence; /* for buffer_wait & buffer_is_busy */
 };
 
 struct pb_manager *amdgpu_bomgr_create(struct amdgpu_winsys *rws);
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index 7b32ae3..7064474 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -447,6 +447,10 @@ void amdgpu_cs_emit_ioctl_oneshot(struct amdgpu_cs *cs, struct amdgpu_cs_context
    } else {
       /* Success. */
       amdgpu_fence_submitted(csc->fence, fence);
+
+      for (i = 0; i < csc->num_buffers; i++) {
+         amdgpu_fence_reference(&csc->buffers[i].bo->fence, csc->fence);
+      }
    }
 
    /* Cleanup. */




More information about the mesa-commit mailing list