vkd3d: Use VK_ACCESS_MEMORY_{READ,WRITE}_BIT where appropriate

Buggy RADV versions no longer work due to missing extension support.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2022-04-04 13:20:52 +02:00 committed by Hans-Kristian Arntzen
parent 8dda6df729
commit d1425ee4d1
1 changed files with 3 additions and 88 deletions

View File

@ -3653,74 +3653,6 @@ static void d3d12_command_list_invalidate_root_parameters(struct d3d12_command_l
}
}
static VkAccessFlags vk_access_flags_all_possible_for_buffer(const struct d3d12_device *device,
VkQueueFlags vk_queue_flags, bool consider_reads)
{
/* FIXME: Should use MEMORY_READ/WRITE_BIT here, but older RADV is buggy,
* and does not consider these access flags at all.
* Exhaustively enumerate all relevant access flags ...
* TODO: Should be replaced with MEMORY_READ/WRITE_BIT eventually when
* we're confident we don't care about older drivers.
* Driver was fixed around 2020-07-08. */
VkAccessFlags access = VK_ACCESS_TRANSFER_WRITE_BIT;
if (consider_reads)
access |= VK_ACCESS_TRANSFER_READ_BIT;
if (vk_queue_flags & (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT))
{
access |= VK_ACCESS_SHADER_WRITE_BIT;
if (consider_reads)
access |= VK_ACCESS_SHADER_READ_BIT;
}
if ((vk_queue_flags & VK_QUEUE_GRAPHICS_BIT) && device->vk_info.EXT_transform_feedback)
{
access |= VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT |
VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT;
if (consider_reads)
access |= VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT;
}
if (consider_reads && (vk_queue_flags & VK_QUEUE_GRAPHICS_BIT) &&
device->device_info.conditional_rendering_features.conditionalRendering)
access |= VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT;
if (consider_reads && (vk_queue_flags & VK_QUEUE_GRAPHICS_BIT))
{
access |= VK_ACCESS_UNIFORM_READ_BIT |
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT |
VK_ACCESS_INDEX_READ_BIT |
VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
}
return access;
}
static VkAccessFlags vk_access_flags_all_possible_for_image(const struct d3d12_device *device,
D3D12_RESOURCE_FLAGS flags, VkQueueFlags vk_queue_flags, bool consider_reads)
{
/* Should use MEMORY_READ/WRITE_BIT here, but current RADV is buggy,
* and does not consider these access flags at all.
* Exhaustively enumerate all relevant access flags ... */
VkAccessFlags access = 0;
if (flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS)
{
access |= VK_ACCESS_SHADER_WRITE_BIT;
if (consider_reads)
access |= VK_ACCESS_SHADER_READ_BIT;
}
if (consider_reads && !(flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE))
access |= VK_ACCESS_SHADER_READ_BIT;
/* Copies, render targets and resolve related operations are handled specifically on images elsewhere.
* The only possible access flags for images in common layouts are SHADER_READ/WRITE. */
return access;
}
static void vk_access_and_stage_flags_from_d3d12_resource_state(const struct d3d12_command_list *list,
const struct d3d12_resource *resource, uint32_t state_mask, VkQueueFlags vk_queue_flags,
VkPipelineStageFlags *stages, VkAccessFlags *access)
@ -3734,11 +3666,7 @@ static void vk_access_and_stage_flags_from_d3d12_resource_state(const struct d3d
if (state_mask == D3D12_RESOURCE_STATE_COMMON)
{
*stages |= VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
if (d3d12_resource_is_buffer(resource))
*access |= vk_access_flags_all_possible_for_buffer(device, vk_queue_flags, true);
else
*access |= vk_access_flags_all_possible_for_image(device, resource->desc.Flags, vk_queue_flags, true);
return;
*access |= VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
}
while (state_mask)
@ -7353,19 +7281,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(d3d12_command_l
* quite weird. We cannot perform UNDEFINED transitions here, even if that is what makes sense.
* UNDEFINED transitions are deferred to their required "activation" command, which is a full-subresource
* command that writes every pixel. We detect those cases and perform a transition away from UNDEFINED. */
if (before && d3d12_resource_is_texture(before))
{
alias_src_access = vk_access_flags_all_possible_for_image(list->device,
before->desc.Flags,
list->vk_queue_flags,
false);
}
else
{
alias_src_access = vk_access_flags_all_possible_for_buffer(list->device,
list->vk_queue_flags,
false);
}
alias_src_access = VK_ACCESS_MEMORY_WRITE_BIT;
if (after && d3d12_resource_is_texture(after))
{
@ -7378,8 +7294,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(d3d12_command_l
}
else
{
alias_dst_access = vk_access_flags_all_possible_for_buffer(list->device,
list->vk_queue_flags, true);
alias_dst_access = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
}
batch.src_stage_mask |= VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;