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@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2018-09-27 13:30:51 +02:00 committed by Alexandre Julliard
parent 82fdd800e2
commit 2e65b78102
2 changed files with 30 additions and 24 deletions

View File

@ -37,6 +37,7 @@ HRESULT vkd3d_queue_create(struct d3d12_device *device,
} }
object->vk_family_index = family_index; object->vk_family_index = family_index;
object->vk_queue_flags = properties->queueFlags;
object->timestamp_bits = properties->timestampValidBits; object->timestamp_bits = properties->timestampValidBits;
VK_CALL(vkGetDeviceQueue(device->vk_device, family_index, 0, &object->vk_queue)); 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); return hresult_from_vk_result(vr);
} }
list->vk_queue_flags = allocator->vk_queue_flags;
if (FAILED(hr = d3d12_command_list_begin_command_buffer(list))) if (FAILED(hr = d3d12_command_list_begin_command_buffer(list)))
{ {
VK_CALL(vkFreeCommandBuffers(device->vk_device, allocator->vk_command_pool, 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->refcount = 1;
allocator->type = type; 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.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
command_pool_info.pNext = NULL; 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, 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) 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) switch (state)
{ {
case D3D12_RESOURCE_STATE_COMMON: /* D3D12_RESOURCE_STATE_PRESENT */ 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 else
{ {
vk_barrier_parameters_from_d3d12_resource_state(present_state, 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 else
@ -1344,12 +1361,7 @@ static bool vk_barrier_parameters_from_d3d12_resource_state(unsigned int state,
case D3D12_RESOURCE_STATE_UNORDERED_ACCESS: case D3D12_RESOURCE_STATE_UNORDERED_ACCESS:
*access_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT; *access_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
*stage_flags = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT *stage_flags = queue_shader_stages;
| 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;
if (image_layout) if (image_layout)
*image_layout = VK_IMAGE_LAYOUT_GENERAL; *image_layout = VK_IMAGE_LAYOUT_GENERAL;
return true; 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 *access_mask |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
| VK_ACCESS_UNIFORM_READ_BIT; | VK_ACCESS_UNIFORM_READ_BIT;
*stage_flags |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT *stage_flags |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
| VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | queue_shader_stages;
| 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;
state &= ~D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER; 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) if (state & D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE)
{ {
*access_mask |= VK_ACCESS_SHADER_READ_BIT; *access_mask |= VK_ACCESS_SHADER_READ_BIT;
*stage_flags |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT *stage_flags |= (queue_shader_stages & ~VK_PIPELINE_STAGE_FRAGMENT_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;
state &= ~D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; state &= ~D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
} }
if (state & D3D12_RESOURCE_STATE_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, if (!vk_barrier_parameters_from_d3d12_resource_state(resource->initial_state,
resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION, resource->present_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); FIXME("Unhandled state %#x.\n", resource->initial_state);
return; return;
@ -3069,14 +3072,14 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
if (!vk_barrier_parameters_from_d3d12_resource_state(transition->StateBefore, if (!vk_barrier_parameters_from_d3d12_resource_state(transition->StateBefore,
resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION, resource->present_state, 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); FIXME("Unhandled state %#x.\n", transition->StateBefore);
continue; continue;
} }
if (!vk_barrier_parameters_from_d3d12_resource_state(transition->StateAfter, if (!vk_barrier_parameters_from_d3d12_resource_state(transition->StateAfter,
resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION, resource->present_state, 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); FIXME("Unhandled state %#x.\n", transition->StateAfter);
continue; continue;
@ -3097,7 +3100,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
resource = unsafe_impl_from_ID3D12Resource(uav->pResource); resource = unsafe_impl_from_ID3D12Resource(uav->pResource);
vk_barrier_parameters_from_d3d12_resource_state(D3D12_RESOURCE_STATE_UNORDERED_ACCESS, vk_barrier_parameters_from_d3d12_resource_state(D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
resource && (resource->flags & VKD3D_RESOURCE_PRESENT_STATE_TRANSITION), 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); &access_mask, &stage_mask, &image_layout);
src_access_mask = dst_access_mask = access_mask; src_access_mask = dst_access_mask = access_mask;
src_stage_mask = dst_stage_mask = stage_mask; src_stage_mask = dst_stage_mask = stage_mask;

View File

@ -593,6 +593,7 @@ struct d3d12_command_allocator
LONG refcount; LONG refcount;
D3D12_COMMAND_LIST_TYPE type; D3D12_COMMAND_LIST_TYPE type;
VkQueueFlags vk_queue_flags;
VkCommandPool vk_command_pool; VkCommandPool vk_command_pool;
@ -658,10 +659,11 @@ struct d3d12_command_list
LONG refcount; LONG refcount;
D3D12_COMMAND_LIST_TYPE type; D3D12_COMMAND_LIST_TYPE type;
VkQueueFlags vk_queue_flags;
VkCommandBuffer vk_command_buffer;
bool is_recording; bool is_recording;
bool is_valid; bool is_valid;
VkCommandBuffer vk_command_buffer;
uint32_t strides[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; uint32_t strides[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
VkPrimitiveTopology primitive_topology; VkPrimitiveTopology primitive_topology;
@ -692,6 +694,7 @@ struct vkd3d_queue
pthread_mutex_t mutex; pthread_mutex_t mutex;
VkQueue vk_queue; VkQueue vk_queue;
uint32_t vk_family_index; uint32_t vk_family_index;
VkQueueFlags vk_queue_flags;
uint32_t timestamp_bits; uint32_t timestamp_bits;
}; };