summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLionel Landwerlin <[email protected]>2019-08-07 16:46:45 +0300
committerLionel Landwerlin <[email protected]>2019-11-11 21:46:51 +0000
commit206ab49ba10f502583a4c95c89026d4dabab1ddd (patch)
tree3b5467554b6b11fb9eb8a162a0e620d896bff40b /src
parent2f4dcc8a1cd08be2c293286865fe5e8683d16fb2 (diff)
anv: expose timeout helpers outside of anv_queue.c
Signed-off-by: Lionel Landwerlin <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/anv_private.h5
-rw-r--r--src/intel/vulkan/anv_queue.c96
2 files changed, 51 insertions, 50 deletions
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index bdbe594a3ba..6c96bb04494 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -91,6 +91,8 @@ struct gen_perf_config;
#include "common/intel_log.h"
#include "wsi_common.h"
+#define NSEC_PER_SEC 1000000000ull
+
/* anv Virtual Memory Layout
* =========================
*
@@ -1308,6 +1310,9 @@ VkResult anv_device_bo_busy(struct anv_device *device, struct anv_bo *bo);
VkResult anv_device_wait(struct anv_device *device, struct anv_bo *bo,
int64_t timeout);
+uint64_t anv_gettime_ns(void);
+uint64_t anv_get_absolute_timeout(uint64_t timeout);
+
void* anv_gem_mmap(struct anv_device *device,
uint32_t gem_handle, uint64_t offset, uint64_t size, uint32_t flags);
void anv_gem_munmap(void *p, uint64_t size);
diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c
index 6dbb50246e7..5cbfd0287af 100644
--- a/src/intel/vulkan/anv_queue.c
+++ b/src/intel/vulkan/anv_queue.c
@@ -33,6 +33,49 @@
#include "genxml/gen7_pack.h"
+uint64_t anv_gettime_ns(void)
+{
+ struct timespec current;
+ clock_gettime(CLOCK_MONOTONIC, &current);
+ return (uint64_t)current.tv_sec * NSEC_PER_SEC + current.tv_nsec;
+}
+
+uint64_t anv_get_absolute_timeout(uint64_t timeout)
+{
+ if (timeout == 0)
+ return 0;
+ uint64_t current_time = anv_gettime_ns();
+ uint64_t max_timeout = (uint64_t) INT64_MAX - current_time;
+
+ timeout = MIN2(max_timeout, timeout);
+
+ return (current_time + timeout);
+}
+
+static int64_t anv_get_relative_timeout(uint64_t abs_timeout)
+{
+ uint64_t now = anv_gettime_ns();
+
+ /* We don't want negative timeouts.
+ *
+ * DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and is
+ * supposed to block indefinitely timeouts < 0. Unfortunately,
+ * this was broken for a couple of kernel releases. Since there's
+ * no way to know whether or not the kernel we're using is one of
+ * the broken ones, the best we can do is to clamp the timeout to
+ * INT64_MAX. This limits the maximum timeout from 584 years to
+ * 292 years - likely not a big deal.
+ */
+ if (abs_timeout < now)
+ return 0;
+
+ uint64_t rel_timeout = abs_timeout - now;
+ if (rel_timeout > (uint64_t) INT64_MAX)
+ rel_timeout = INT64_MAX;
+
+ return rel_timeout;
+}
+
VkResult
anv_device_execbuf(struct anv_device *device,
struct drm_i915_gem_execbuffer2 *execbuf,
@@ -449,53 +492,6 @@ VkResult anv_GetFenceStatus(
}
}
-#define NSEC_PER_SEC 1000000000
-#define INT_TYPE_MAX(type) ((1ull << (sizeof(type) * 8 - 1)) - 1)
-
-static uint64_t
-gettime_ns(void)
-{
- struct timespec current;
- clock_gettime(CLOCK_MONOTONIC, &current);
- return (uint64_t)current.tv_sec * NSEC_PER_SEC + current.tv_nsec;
-}
-
-static uint64_t anv_get_absolute_timeout(uint64_t timeout)
-{
- if (timeout == 0)
- return 0;
- uint64_t current_time = gettime_ns();
- uint64_t max_timeout = (uint64_t) INT64_MAX - current_time;
-
- timeout = MIN2(max_timeout, timeout);
-
- return (current_time + timeout);
-}
-
-static int64_t anv_get_relative_timeout(uint64_t abs_timeout)
-{
- uint64_t now = gettime_ns();
-
- /* We don't want negative timeouts.
- *
- * DRM_IOCTL_I915_GEM_WAIT uses a signed 64 bit timeout and is
- * supposed to block indefinitely timeouts < 0. Unfortunately,
- * this was broken for a couple of kernel releases. Since there's
- * no way to know whether or not the kernel we're using is one of
- * the broken ones, the best we can do is to clamp the timeout to
- * INT64_MAX. This limits the maximum timeout from 584 years to
- * 292 years - likely not a big deal.
- */
- if (abs_timeout < now)
- return 0;
-
- uint64_t rel_timeout = abs_timeout - now;
- if (rel_timeout > (uint64_t) INT64_MAX)
- rel_timeout = INT64_MAX;
-
- return rel_timeout;
-}
-
static VkResult
anv_wait_for_syncobj_fences(struct anv_device *device,
uint32_t fenceCount,
@@ -529,7 +525,7 @@ anv_wait_for_syncobj_fences(struct anv_device *device,
do {
ret = anv_gem_syncobj_wait(device, syncobjs, fenceCount,
abs_timeout_ns, waitAll);
- } while (ret == -1 && errno == ETIME && gettime_ns() < abs_timeout_ns);
+ } while (ret == -1 && errno == ETIME && anv_gettime_ns() < abs_timeout_ns);
vk_free(&device->alloc, syncobjs);
@@ -641,7 +637,7 @@ anv_wait_for_bo_fences(struct anv_device *device,
ret = pthread_cond_timedwait(&device->queue_submit,
&device->mutex, &abstime);
assert(ret != EINVAL);
- if (gettime_ns() >= abs_timeout_ns) {
+ if (anv_gettime_ns() >= abs_timeout_ns) {
pthread_mutex_unlock(&device->mutex);
result = VK_TIMEOUT;
goto done;
@@ -707,7 +703,7 @@ anv_wait_for_fences(struct anv_device *device,
if (anv_wait_for_fences(device, 1, &pFences[i], true, 0) == VK_SUCCESS)
return VK_SUCCESS;
}
- } while (gettime_ns() < abs_timeout);
+ } while (anv_gettime_ns() < abs_timeout);
result = VK_TIMEOUT;
}
return result;