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