=?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