=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d: Allow simultaneous buffer access from multiple queues.

Alexandre Julliard julliard at winehq.org
Fri May 3 13:47:09 CDT 2019


Module: vkd3d
Branch: master
Commit: 2126614a03b7862a71b0999ef8f1c64e23262f15
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=2126614a03b7862a71b0999ef8f1c64e23262f15

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Thu May  2 16:02:36 2019 +0200

vkd3d: Allow simultaneous buffer access from multiple queues.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d/device.c        | 15 ++++++++++++---
 libs/vkd3d/resource.c      |  8 ++++----
 libs/vkd3d/vkd3d_private.h |  7 +++++--
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 052d4f6..41f7ea1 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1449,22 +1449,31 @@ static HRESULT d3d12_device_create_vkd3d_queues(struct d3d12_device *device,
     device->compute_queue = NULL;
     device->copy_queue = NULL;
 
-    if (FAILED((hr = vkd3d_queue_create(device, direct_family_index,
+    device->queue_family_count = 0;
+    memset(device->queue_family_indices, 0, sizeof(device->queue_family_indices));
+
+    if (SUCCEEDED((hr = vkd3d_queue_create(device, direct_family_index,
             &queue_info->vk_properties[VKD3D_QUEUE_FAMILY_DIRECT], &device->direct_queue))))
+        device->queue_family_indices[device->queue_family_count++] = direct_family_index;
+    else
         goto out_destroy_queues;
 
     if (compute_family_index == direct_family_index)
         device->compute_queue = device->direct_queue;
-    else if (FAILED(hr = vkd3d_queue_create(device, compute_family_index,
+    else if (SUCCEEDED(hr = vkd3d_queue_create(device, compute_family_index,
             &queue_info->vk_properties[VKD3D_QUEUE_FAMILY_COMPUTE], &device->compute_queue)))
+        device->queue_family_indices[device->queue_family_count++] = compute_family_index;
+    else
         goto out_destroy_queues;
 
     if (transfer_family_index == direct_family_index)
         device->copy_queue = device->direct_queue;
     else if (transfer_family_index == compute_family_index)
         device->copy_queue = device->compute_queue;
-    else if (FAILED(hr = vkd3d_queue_create(device, transfer_family_index,
+    else if (SUCCEEDED(hr = vkd3d_queue_create(device, transfer_family_index,
             &queue_info->vk_properties[VKD3D_QUEUE_FAMILY_TRANSFER], &device->copy_queue)))
+        device->queue_family_indices[device->queue_family_count++] = transfer_family_index;
+    else
         goto out_destroy_queues;
 
     return S_OK;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 8485585..9e6216a 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -529,10 +529,10 @@ HRESULT vkd3d_create_buffer(struct d3d12_device *device,
     if (!(desc->Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE))
         buffer_info.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
 
-    /* FIXME: Buffers always can be accessed from multiple queues. */
-    buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
-    buffer_info.queueFamilyIndexCount = 0;
-    buffer_info.pQueueFamilyIndices = 0;
+    /* Buffers always have properties of D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS. */
+    buffer_info.sharingMode = VK_SHARING_MODE_CONCURRENT;
+    buffer_info.queueFamilyIndexCount = device->queue_family_count;
+    buffer_info.pQueueFamilyIndices = device->queue_family_indices;
 
     if ((vr = VK_CALL(vkCreateBuffer(device->vk_device, &buffer_info, NULL, vk_buffer))) < 0)
     {
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index b333182..0335822 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -48,8 +48,9 @@
 #define VKD3D_DESCRIPTOR_MAGIC_DSV     0x00565344u
 #define VKD3D_DESCRIPTOR_MAGIC_RTV     0x00565452u
 
-#define VKD3D_MAX_SHADER_STAGES     5u
-#define VKD3D_MAX_VK_SYNC_OBJECTS_PER_D3D12_FENCE 4
+#define VKD3D_MAX_QUEUE_FAMILY_COUNT              3u
+#define VKD3D_MAX_SHADER_STAGES                   5u
+#define VKD3D_MAX_VK_SYNC_OBJECTS_PER_D3D12_FENCE 4u
 
 struct d3d12_command_list;
 struct d3d12_device;
@@ -970,6 +971,8 @@ struct d3d12_device
     struct vkd3d_queue *direct_queue;
     struct vkd3d_queue *compute_queue;
     struct vkd3d_queue *copy_queue;
+    uint32_t queue_family_indices[VKD3D_MAX_QUEUE_FAMILY_COUNT];
+    unsigned int queue_family_count;
 
     struct vkd3d_instance *vkd3d_instance;
 




More information about the wine-cvs mailing list