=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: vkd3d: Fix shader stage bits for pipeline barriers.
Alexandre Julliard
julliard at winehq.org
Thu Sep 27 18:25:03 CDT 2018
Module: vkd3d
Branch: master
Commit: 2e65b78102540f2ece890601582d719f141a30d1
URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=2e65b78102540f2ece890601582d719f141a30d1
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Thu Sep 27 13:30:51 2018 +0200
vkd3d: Fix shader stage bits for pipeline barriers.
The Vulkan spec says:
"Any pipeline stage included in srcStageMask or dstStageMask must be
supported by the capabilities of the queue family..."
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 | 49 ++++++++++++++++++++++++----------------------
libs/vkd3d/vkd3d_private.h | 5 ++++-
2 files changed, 30 insertions(+), 24 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 031f61e..5fd0936 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -37,6 +37,7 @@ HRESULT vkd3d_queue_create(struct d3d12_device *device,
}
object->vk_family_index = family_index;
+ object->vk_queue_flags = properties->queueFlags;
object->timestamp_bits = properties->timestampValidBits;
VK_CALL(vkGetDeviceQueue(device->vk_device, family_index, 0, &object->vk_queue));
@@ -667,6 +668,8 @@ static HRESULT d3d12_command_allocator_allocate_command_buffer(struct d3d12_comm
return hresult_from_vk_result(vr);
}
+ list->vk_queue_flags = allocator->vk_queue_flags;
+
if (FAILED(hr = d3d12_command_list_begin_command_buffer(list)))
{
VK_CALL(vkFreeCommandBuffers(device->vk_device, allocator->vk_command_pool,
@@ -1169,6 +1172,7 @@ static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allo
allocator->refcount = 1;
allocator->type = type;
+ allocator->vk_queue_flags = queue->vk_queue_flags;
command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
command_pool_info.pNext = NULL;
@@ -1297,9 +1301,22 @@ static void d3d12_command_list_invalidate_bindings(struct d3d12_command_list *li
}
static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
- bool is_swapchain_image, D3D12_RESOURCE_STATES present_state,
+ bool is_swapchain_image, D3D12_RESOURCE_STATES present_state, VkQueueFlags vk_queue_flags,
VkAccessFlags *access_mask, VkPipelineStageFlags *stage_flags, VkImageLayout *image_layout)
{
+ VkPipelineStageFlags queue_shader_stages = 0;
+
+ if (vk_queue_flags & VK_QUEUE_GRAPHICS_BIT)
+ {
+ queue_shader_stages |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
+ | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
+ | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
+ | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
+ | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
+ }
+ if (vk_queue_flags & VK_QUEUE_COMPUTE_BIT)
+ queue_shader_stages |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
+
switch (state)
{
case D3D12_RESOURCE_STATE_COMMON: /* D3D12_RESOURCE_STATE_PRESENT */
@@ -1321,7 +1338,7 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
else
{
vk_barrier_parameters_from_d3d12_resource_state(present_state,
- false, 0, access_mask, stage_flags, image_layout);
+ false, 0, vk_queue_flags, access_mask, stage_flags, image_layout);
}
}
else
@@ -1344,12 +1361,7 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
case D3D12_RESOURCE_STATE_UNORDERED_ACCESS:
*access_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
- *stage_flags = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
- | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
- | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
- | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
- | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
- | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
+ *stage_flags = queue_shader_stages;
if (image_layout)
*image_layout = VK_IMAGE_LAYOUT_GENERAL;
return true;
@@ -1419,12 +1431,7 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
*access_mask |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
| VK_ACCESS_UNIFORM_READ_BIT;
*stage_flags |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
- | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
- | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
- | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
- | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
- | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
- | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
+ | queue_shader_stages;
state &= ~D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER;
}
@@ -1446,11 +1453,7 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
if (state & D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE)
{
*access_mask |= VK_ACCESS_SHADER_READ_BIT;
- *stage_flags |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
- | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
- | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
- | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
- | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
+ *stage_flags |= (queue_shader_stages & ~VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
state &= ~D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
}
if (state & D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)
@@ -1509,7 +1512,7 @@ static void d3d12_command_list_transition_resource_to_initial_state(struct d3d12
if (!vk_barrier_parameters_from_d3d12_resource_state(resource->initial_state,
resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION, resource->present_state,
- &barrier.dstAccessMask, &dst_stage_mask, &barrier.newLayout))
+ list->vk_queue_flags, &barrier.dstAccessMask, &dst_stage_mask, &barrier.newLayout))
{
FIXME("Unhandled state %#x.\n", resource->initial_state);
return;
@@ -3069,14 +3072,14 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
if (!vk_barrier_parameters_from_d3d12_resource_state(transition->StateBefore,
resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION, resource->present_state,
- &src_access_mask, &src_stage_mask, &layout_before))
+ list->vk_queue_flags, &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->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION, resource->present_state,
- &dst_access_mask, &dst_stage_mask, &layout_after))
+ list->vk_queue_flags, &dst_access_mask, &dst_stage_mask, &layout_after))
{
FIXME("Unhandled state %#x.\n", transition->StateAfter);
continue;
@@ -3097,7 +3100,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 && (resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION),
- resource ? resource->present_state : 0,
+ resource ? resource->present_state : 0, list->vk_queue_flags,
&access_mask, &stage_mask, &image_layout);
src_access_mask = dst_access_mask = access_mask;
src_stage_mask = dst_stage_mask = stage_mask;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index e47e538..bffae35 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -593,6 +593,7 @@ struct d3d12_command_allocator
LONG refcount;
D3D12_COMMAND_LIST_TYPE type;
+ VkQueueFlags vk_queue_flags;
VkCommandPool vk_command_pool;
@@ -658,10 +659,11 @@ struct d3d12_command_list
LONG refcount;
D3D12_COMMAND_LIST_TYPE type;
+ VkQueueFlags vk_queue_flags;
- VkCommandBuffer vk_command_buffer;
bool is_recording;
bool is_valid;
+ VkCommandBuffer vk_command_buffer;
uint32_t strides[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
VkPrimitiveTopology primitive_topology;
@@ -692,6 +694,7 @@ struct vkd3d_queue
pthread_mutex_t mutex;
VkQueue vk_queue;
uint32_t vk_family_index;
+ VkQueueFlags vk_queue_flags;
uint32_t timestamp_bits;
};
More information about the wine-cvs
mailing list