=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d: Implement D3D12_RESOURCE_STATE_PREDICATION resource barriers.

Alexandre Julliard julliard at winehq.org
Tue Jun 18 17:21:30 CDT 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Tue Jun 18 10:07:52 2019 +0200

vkd3d: Implement D3D12_RESOURCE_STATE_PREDICATION resource barriers.

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 | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 99f607a..47f7a13 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1870,7 +1870,7 @@ static void d3d12_command_list_invalidate_bindings(struct d3d12_command_list *li
 }
 
 static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
-        const struct d3d12_resource *resource, VkQueueFlags vk_queue_flags,
+        const struct d3d12_resource *resource, VkQueueFlags vk_queue_flags, const struct vkd3d_vulkan_info *vk_info,
         VkAccessFlags *access_mask, VkPipelineStageFlags *stage_flags, VkImageLayout *image_layout)
 {
     bool is_swapchain_image = resource && (resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION);
@@ -1909,7 +1909,7 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
                 else if (resource->present_state != D3D12_RESOURCE_STATE_COMMON)
                 {
                     vk_barrier_parameters_from_d3d12_resource_state(resource->present_state,
-                            resource, vk_queue_flags, access_mask, stage_flags, image_layout);
+                            resource, vk_queue_flags, vk_info, access_mask, stage_flags, image_layout);
                     return true;
                 }
             }
@@ -2044,6 +2044,11 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
     {
         *access_mask |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
         *stage_flags |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
+        if (vk_info->EXT_conditional_rendering)
+        {
+            *access_mask |= VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT;
+            *stage_flags |= VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT;
+        }
         state &= ~D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT;
     }
 
@@ -2066,6 +2071,7 @@ static void d3d12_command_list_transition_resource_to_initial_state(struct d3d12
         struct d3d12_resource *resource)
 {
     const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
+    const struct vkd3d_vulkan_info *vk_info = &list->device->vk_info;
     VkPipelineStageFlags src_stage_mask, dst_stage_mask;
     const struct vkd3d_format *format;
     VkImageMemoryBarrier barrier;
@@ -2088,7 +2094,7 @@ static void d3d12_command_list_transition_resource_to_initial_state(struct d3d12
             VK_IMAGE_LAYOUT_PREINITIALIZED : VK_IMAGE_LAYOUT_UNDEFINED;
 
     if (!vk_barrier_parameters_from_d3d12_resource_state(resource->initial_state,
-            resource, list->vk_queue_flags, &barrier.dstAccessMask, &dst_stage_mask, &barrier.newLayout))
+            resource, list->vk_queue_flags, vk_info, &barrier.dstAccessMask, &dst_stage_mask, &barrier.newLayout))
     {
         FIXME("Unhandled state %#x.\n", resource->initial_state);
         return;
@@ -3710,11 +3716,13 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
     struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList1(iface);
     bool have_aliasing_barriers = false, have_split_barriers = false;
     const struct vkd3d_vk_device_procs *vk_procs;
+    const struct vkd3d_vulkan_info *vk_info;
     unsigned int i;
 
     TRACE("iface %p, barrier_count %u, barriers %p.\n", iface, barrier_count, barriers);
 
     vk_procs = &list->device->vk_procs;
+    vk_info = &list->device->vk_info;
 
     d3d12_command_list_end_current_render_pass(list);
 
@@ -3762,13 +3770,13 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
                 sub_resource_idx = transition->Subresource;
 
                 if (!vk_barrier_parameters_from_d3d12_resource_state(transition->StateBefore,
-                        resource, list->vk_queue_flags, &src_access_mask, &src_stage_mask, &layout_before))
+                        resource, list->vk_queue_flags, vk_info, &src_access_mask, &src_stage_mask, &layout_before))
                 {
                     FIXME("Unhandled state %#x.\n", transition->StateBefore);
                     continue;
                 }
                 if (!vk_barrier_parameters_from_d3d12_resource_state(transition->StateAfter,
-                        resource, list->vk_queue_flags, &dst_access_mask, &dst_stage_mask, &layout_after))
+                        resource, list->vk_queue_flags, vk_info, &dst_access_mask, &dst_stage_mask, &layout_after))
                 {
                     FIXME("Unhandled state %#x.\n", transition->StateAfter);
                     continue;
@@ -3788,7 +3796,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
 
                 resource = unsafe_impl_from_ID3D12Resource(uav->pResource);
                 vk_barrier_parameters_from_d3d12_resource_state(D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
-                        resource, list->vk_queue_flags, &access_mask, &stage_mask, &image_layout);
+                        resource, list->vk_queue_flags, vk_info, &access_mask, &stage_mask, &image_layout);
                 src_access_mask = dst_access_mask = access_mask;
                 src_stage_mask = dst_stage_mask = stage_mask;
                 layout_before = layout_after = image_layout;
@@ -4658,6 +4666,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
 {
     struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList1(iface);
     const struct vkd3d_vk_device_procs *vk_procs;
+    const struct vkd3d_vulkan_info *vk_info;
     const struct d3d12_desc *cpu_descriptor;
     struct d3d12_resource *resource_impl;
     VkBufferMemoryBarrier buffer_barrier;
@@ -4670,6 +4679,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
             iface, gpu_handle.ptr, cpu_handle.ptr, resource, values, rect_count, rects);
 
     vk_procs = &list->device->vk_procs;
+    vk_info = &list->device->vk_info;
 
     resource_impl = unsafe_impl_from_ID3D12Resource(resource);
 
@@ -4706,7 +4716,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
         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);
+                resource_impl, list->vk_queue_flags, vk_info, &buffer_barrier.dstAccessMask, &stage_mask, NULL);
 
         VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer,
                 VK_PIPELINE_STAGE_TRANSFER_BIT, stage_mask, 0,
@@ -4739,7 +4749,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
         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);
+                resource_impl, list->vk_queue_flags, vk_info, &image_barrier.dstAccessMask, &stage_mask, NULL);
 
         VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer,
                 VK_PIPELINE_STAGE_TRANSFER_BIT, stage_mask, 0,




More information about the wine-cvs mailing list