=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d: Emit barriers in ClearUnorderedAccessViewUint().

Alexandre Julliard julliard at winehq.org
Tue Jun 11 16:49:24 CDT 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Tue Jun 11 10:13:30 2019 +0200

vkd3d: Emit barriers in ClearUnorderedAccessViewUint().

We use transfer operations instead of unordered access.

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/command.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 560b697..ec9e25d 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -4618,6 +4618,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
     const struct vkd3d_vk_device_procs *vk_procs;
     const struct d3d12_desc *cpu_descriptor;
     struct d3d12_resource *resource_impl;
+    VkBufferMemoryBarrier buffer_barrier;
+    VkImageMemoryBarrier image_barrier;
+    VkPipelineStageFlags stage_mask;
     VkImageSubresourceRange range;
     VkClearColorValue color;
 
@@ -4650,6 +4653,22 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
 
         VK_CALL(vkCmdFillBuffer(list->vk_command_buffer, resource_impl->u.vk_buffer,
                 cpu_descriptor->uav.buffer.offset, cpu_descriptor->uav.buffer.size, values[0]));
+
+        buffer_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
+        buffer_barrier.pNext = NULL;
+        buffer_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+        buffer_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        buffer_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        buffer_barrier.buffer = resource_impl->u.vk_buffer;
+        buffer_barrier.offset = cpu_descriptor->uav.buffer.offset;
+        buffer_barrier.size = cpu_descriptor->uav.buffer.size;
+
+        vk_barrier_parameters_from_d3d12_resource_state(D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
+                resource_impl, list->vk_queue_flags, &buffer_barrier.dstAccessMask, &stage_mask, NULL);
+
+        VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer,
+                VK_PIPELINE_STAGE_TRANSFER_BIT, stage_mask, 0,
+                0, NULL, 1, &buffer_barrier, 0, NULL));
     }
     else
     {
@@ -4666,6 +4685,23 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
 
         VK_CALL(vkCmdClearColorImage(list->vk_command_buffer,
                 resource_impl->u.vk_image, VK_IMAGE_LAYOUT_GENERAL, &color, 1, &range));
+
+        image_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+        image_barrier.pNext = NULL;
+        image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+        image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+        image_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+        image_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        image_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+        image_barrier.image = resource_impl->u.vk_image;
+        image_barrier.subresourceRange = range;
+
+        vk_barrier_parameters_from_d3d12_resource_state(D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
+                resource_impl, list->vk_queue_flags, &image_barrier.dstAccessMask, &stage_mask, NULL);
+
+        VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer,
+                VK_PIPELINE_STAGE_TRANSFER_BIT, stage_mask, 0,
+                0, NULL, 0, NULL, 1, &image_barrier));
     }
 }
 




More information about the wine-cvs mailing list