summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>2018-01-27 14:51:12 +0100
committerchrome-bot <chrome-bot@chromium.org>2018-03-14 09:42:21 -0700
commita0f76c6a3b92db47dfb16717ede3b58e45847675 (patch)
tree6b8302eaf2d256760b56fb9d4bb4007bdabc9cc6 /src
parent7c5b8d163fa8d21be93c3054bb35ada8929b4610 (diff)
UPSTREAM: radv: Signal fence correctly after sparse binding.
It did not signal syncobjs in the fence, and also signalled too early if there was work on the queue already, as we have to wait till that work is done. Fixes: d27aaae4d2 "radv: Add external fence support." Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> (cherry picked from commit 0347a83bbfd8d993742e125335c6ae46a6aa5a15) BUG=b:73102056 TEST=run nougat-mr1-cts-dev deqp vulkan tests. Change-Id: I887768385833112effa1e8d414bf171640bb3564 Reviewed-on: https://chromium-review.googlesource.com/913504 Commit-Ready: Bas Nieuwenhuizen <basni@chromium.org> Tested-by: Bas Nieuwenhuizen <basni@chromium.org> Reviewed-by: Chad Versace <chadversary@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/amd/vulkan/radv_device.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 44581586873..a336ab40b10 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -1906,6 +1906,32 @@ VkResult radv_alloc_sem_info(struct radv_winsys_sem_info *sem_info,
return ret;
}
+/* Signals fence as soon as all the work currently put on queue is done. */
+static VkResult radv_signal_fence(struct radv_queue *queue,
+ struct radv_fence *fence)
+{
+ int ret;
+ VkResult result;
+ struct radv_winsys_sem_info sem_info;
+
+ result = radv_alloc_sem_info(&sem_info, 0, NULL, 0, NULL,
+ radv_fence_to_handle(fence));
+ if (result != VK_SUCCESS)
+ return result;
+
+ ret = queue->device->ws->cs_submit(queue->hw_ctx, queue->queue_idx,
+ &queue->device->empty_cs[queue->queue_family_index],
+ 1, NULL, NULL, &sem_info,
+ false, fence->fence);
+ radv_free_sem_info(&sem_info);
+
+ /* TODO: find a better error */
+ if (ret)
+ return vk_error(VK_ERROR_OUT_OF_DEVICE_MEMORY);
+
+ return VK_SUCCESS;
+}
+
VkResult radv_QueueSubmit(
VkQueue _queue,
uint32_t submitCount,
@@ -2032,18 +2058,7 @@ VkResult radv_QueueSubmit(
if (fence) {
if (!fence_emitted) {
- struct radv_winsys_sem_info sem_info;
-
- result = radv_alloc_sem_info(&sem_info, 0, NULL, 0, NULL,
- _fence);
- if (result != VK_SUCCESS)
- return result;
-
- ret = queue->device->ws->cs_submit(ctx, queue->queue_idx,
- &queue->device->empty_cs[queue->queue_family_index],
- 1, NULL, NULL, &sem_info,
- false, base_fence);
- radv_free_sem_info(&sem_info);
+ radv_signal_fence(queue, fence);
}
fence->submitted = true;
}
@@ -2555,8 +2570,11 @@ radv_sparse_image_opaque_bind_memory(struct radv_device *device,
}
- if (fence && !fence_emitted) {
- fence->signalled = true;
+ if (fence) {
+ if (!fence_emitted) {
+ radv_signal_fence(queue, fence);
+ }
+ fence->submitted = true;
}
return VK_SUCCESS;