dzn_foreach_aspect(aspect, range->aspectMask) {
D3D12_RESOURCE_STATES after =
- dzn_image_layout_to_state(image, new_layout, aspect);
+ dzn_image_layout_to_state(image, new_layout, aspect, cmdbuf->type);
D3D12_RESOURCE_STATES before =
(old_layout == VK_IMAGE_LAYOUT_UNDEFINED ||
old_layout == VK_IMAGE_LAYOUT_PREINITIALIZED) ?
D3D12_RESOURCE_STATE_COMMON :
- dzn_image_layout_to_state(image, old_layout, aspect);
+ dzn_image_layout_to_state(image, old_layout, aspect, cmdbuf->type);
uint32_t layer_count = dzn_get_layer_count(image, range);
uint32_t level_count = dzn_get_level_count(image, range);
dst_range.layerCount = 1;
}
- D3D12_RESOURCE_STATES src_state = dzn_image_layout_to_state(src_img, src_layout, aspect);
- D3D12_RESOURCE_STATES dst_state = dzn_image_layout_to_state(dst_img, dst_layout, aspect);
+ D3D12_RESOURCE_STATES src_state = dzn_image_layout_to_state(src_img, src_layout, aspect, cmdbuf->type);
+ D3D12_RESOURCE_STATES dst_state = dzn_image_layout_to_state(dst_img, dst_layout, aspect, cmdbuf->type);
D3D12_BARRIER_LAYOUT src_restore_layout = D3D12_BARRIER_LAYOUT_COMMON,
src_needed_layout = D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_GENERIC_READ;
D3D12_BARRIER_LAYOUT dst_restore_layout = D3D12_BARRIER_LAYOUT_COMMON,
D3D12_RESOURCE_STATES
dzn_image_layout_to_state(const struct dzn_image *image,
VkImageLayout layout,
- VkImageAspectFlagBits aspect)
+ VkImageAspectFlagBits aspect,
+ D3D12_COMMAND_LIST_TYPE type)
{
D3D12_RESOURCE_STATES shaders_access =
(image->desc.Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE) ?
- 0 : D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE;
+ 0 : (type == D3D12_COMMAND_LIST_TYPE_DIRECT ?
+ D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE :
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
switch (layout) {
case VK_IMAGE_LAYOUT_PREINITIALIZED:
D3D12_RESOURCE_STATE_DEPTH_WRITE;
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
- return D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE;
+ return shaders_access;
case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT:
return D3D12_RESOURCE_STATE_COMMON;
D3D12_RESOURCE_STATES
dzn_image_layout_to_state(const struct dzn_image *image,
VkImageLayout layout,
- VkImageAspectFlagBits aspect);
+ VkImageAspectFlagBits aspect,
+ D3D12_COMMAND_LIST_TYPE type);
D3D12_BARRIER_LAYOUT
dzn_vk_layout_to_d3d_layout(VkImageLayout layout,