diff options
author | Bas Nieuwenhuizen <[email protected]> | 2018-02-26 23:48:27 +0100 |
---|---|---|
committer | Bas Nieuwenhuizen <[email protected]> | 2018-03-01 01:07:18 +0100 |
commit | 34bd5e2e2e8d9c213b051152f7a8b731151d9be5 (patch) | |
tree | 02635b72eebcb6d1417c4bd8332358196142f709 /src/amd/vulkan/winsys/amdgpu | |
parent | 6968d782d3063c639e80dbcf6df944902d72692f (diff) |
radv: Implement more efficient !waitAll fence waiting.
Reviewed-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd/vulkan/winsys/amdgpu')
-rw-r--r-- | src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index 5632b1d4ee2..d2b33546cc4 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -154,6 +154,39 @@ static bool radv_amdgpu_fence_wait(struct radeon_winsys *_ws, return false; } + +static bool radv_amdgpu_fences_wait(struct radeon_winsys *_ws, + struct radeon_winsys_fence *const *_fences, + uint32_t fence_count, + bool wait_all, + uint64_t timeout) +{ + struct amdgpu_cs_fence *fences = malloc(sizeof(struct amdgpu_cs_fence) * fence_count); + int r; + uint32_t expired = 0, first = 0; + + if (!fences) + return false; + + for (uint32_t i = 0; i < fence_count; ++i) + fences[i] = ((struct radv_amdgpu_fence *)_fences[i])->fence; + + /* Now use the libdrm query. */ + r = amdgpu_cs_wait_fences(fences, fence_count, wait_all, + timeout, &expired, &first); + + free(fences); + if (r) { + fprintf(stderr, "amdgpu: amdgpu_cs_wait_fences failed.\n"); + return false; + } + + if (expired) + return true; + + return false; +} + static void radv_amdgpu_cs_destroy(struct radeon_winsys_cs *rcs) { struct radv_amdgpu_cs *cs = radv_amdgpu_cs(rcs); @@ -1387,4 +1420,5 @@ void radv_amdgpu_cs_init_functions(struct radv_amdgpu_winsys *ws) ws->base.export_syncobj_to_sync_file = radv_amdgpu_export_syncobj_to_sync_file; ws->base.import_syncobj_from_sync_file = radv_amdgpu_import_syncobj_from_sync_file; ws->base.fence_wait = radv_amdgpu_fence_wait; + ws->base.fences_wait = radv_amdgpu_fences_wait; } |