summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/winsys/r600/drm/r600_priv.h2
-rw-r--r--src/gallium/winsys/r600/drm/radeon_bo.c13
2 files changed, 15 insertions, 0 deletions
diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h
index 76a7ba9ec25..285a192e743 100644
--- a/src/gallium/winsys/r600/drm/r600_priv.h
+++ b/src/gallium/winsys/r600/drm/r600_priv.h
@@ -66,6 +66,8 @@ struct radeon_bo {
void *data;
struct list_head fencedlist;
boolean shared;
+ int64_t last_busy;
+ boolean set_busy;
};
struct r600_bo {
diff --git a/src/gallium/winsys/r600/drm/radeon_bo.c b/src/gallium/winsys/r600/drm/radeon_bo.c
index 97138f9f9ef..42a23f0ab8f 100644
--- a/src/gallium/winsys/r600/drm/radeon_bo.c
+++ b/src/gallium/winsys/r600/drm/radeon_bo.c
@@ -32,6 +32,7 @@
#include "r600_priv.h"
#include "xf86drm.h"
#include "radeon_drm.h"
+#include "util/u_time.h"
static int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo)
{
@@ -170,14 +171,23 @@ int radeon_bo_wait(struct radeon *radeon, struct radeon_bo *bo)
return ret;
}
+#define BO_BUSY_BACKOFF 10000
+
int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain)
{
struct drm_radeon_gem_busy args;
int ret;
+ int64_t now;
+ now = os_time_get();
if (LIST_IS_EMPTY(&bo->fencedlist) && !bo->shared)
return 0;
+ if (bo->set_busy && (now - bo->last_busy < BO_BUSY_BACKOFF))
+ return -EBUSY;
+
+ bo->set_busy = FALSE;
+
memset(&args, 0, sizeof(args));
args.handle = bo->handle;
args.domain = 0;
@@ -190,6 +200,9 @@ int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain
LIST_FOR_EACH_ENTRY_SAFE(entry, tent, &bo->fencedlist, fencedlist) {
LIST_DELINIT(&entry->fencedlist);
}
+ } else {
+ bo->set_busy = TRUE;
+ bo->last_busy = now;
}
*domain = args.domain;
return ret;