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

Alexandre Julliard julliard at winehq.org
Mon Jan 14 16:21:24 CST 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Mon Jan 14 17:05:46 2019 +0100

vkd3d: Implement stream output resource barriers naively.

With some tracking we could do better.

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 | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 9c3165c..49c3830 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1308,13 +1308,28 @@ static void d3d12_command_list_end_current_render_pass(struct d3d12_command_list
     {
         VK_CALL(vkCmdEndTransformFeedbackEXT(list->vk_command_buffer, 0, ARRAY_SIZE(list->so_counter_buffers),
                 list->so_counter_buffers, list->so_counter_buffer_offsets));
-        list->xfb_enabled = false;
     }
 
     if (list->current_render_pass)
         VK_CALL(vkCmdEndRenderPass(list->vk_command_buffer));
 
     list->current_render_pass = VK_NULL_HANDLE;
+
+    if (list->xfb_enabled)
+    {
+        VkMemoryBarrier vk_barrier;
+
+        /* We need a barrier between pause and resume. */
+        vk_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+        vk_barrier.pNext = NULL;
+        vk_barrier.srcAccessMask = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT;
+        vk_barrier.dstAccessMask = VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT;
+        VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer,
+                VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, 0,
+                1, &vk_barrier, 0, NULL, 0, NULL));
+
+        list->xfb_enabled = false;
+    }
 }
 
 static void d3d12_command_list_invalidate_current_render_pass(struct d3d12_command_list *list)
@@ -1419,8 +1434,14 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
             return true;
 
         case D3D12_RESOURCE_STATE_STREAM_OUT:
-            FIXME("Unhandled resource state %#x.\n", state);
-            return false;
+            *access_mask = VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT
+                    | VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT
+                    | VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT;
+            *stage_flags = VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
+                    | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
+            if (image_layout)
+                *image_layout = VK_IMAGE_LAYOUT_UNDEFINED;
+            return true;
 
         /* Set the Vulkan image layout for read-only states. */
         case D3D12_RESOURCE_STATE_DEPTH_READ:




More information about the wine-cvs mailing list