diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c index eaa2539ac3e..c98196d8960 100644 --- a/src/microsoft/vulkan/dzn_cmd_buffer.c +++ b/src/microsoft/vulkan/dzn_cmd_buffer.c @@ -396,6 +396,43 @@ static const struct vk_command_buffer_ops cmd_buffer_ops = { .reset = dzn_cmd_buffer_reset, }; +static const D3D12_BARRIER_SYNC cmd_buffer_valid_sync[] = { + [D3D12_COMMAND_LIST_TYPE_DIRECT] = ~(D3D12_BARRIER_SYNC_VIDEO_DECODE | + D3D12_BARRIER_SYNC_VIDEO_PROCESS | + D3D12_BARRIER_SYNC_VIDEO_ENCODE), + [D3D12_COMMAND_LIST_TYPE_COMPUTE] = (D3D12_BARRIER_SYNC_ALL | + D3D12_BARRIER_SYNC_COMPUTE_SHADING | + D3D12_BARRIER_SYNC_RAYTRACING | + D3D12_BARRIER_SYNC_COPY | + D3D12_BARRIER_SYNC_EXECUTE_INDIRECT | + D3D12_BARRIER_SYNC_PREDICATION | + D3D12_BARRIER_SYNC_ALL_SHADING | + D3D12_BARRIER_SYNC_NON_PIXEL_SHADING | + D3D12_BARRIER_SYNC_EMIT_RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO | + D3D12_BARRIER_SYNC_CLEAR_UNORDERED_ACCESS_VIEW | + D3D12_BARRIER_SYNC_BUILD_RAYTRACING_ACCELERATION_STRUCTURE | + D3D12_BARRIER_SYNC_COPY_RAYTRACING_ACCELERATION_STRUCTURE), + [D3D12_COMMAND_LIST_TYPE_COPY] = D3D12_BARRIER_SYNC_ALL | D3D12_BARRIER_SYNC_COPY +}; +static const D3D12_BARRIER_ACCESS cmd_buffer_valid_access[] = { + [D3D12_COMMAND_LIST_TYPE_DIRECT] = ~(D3D12_BARRIER_ACCESS_VIDEO_DECODE_READ | + D3D12_BARRIER_ACCESS_VIDEO_DECODE_WRITE | + D3D12_BARRIER_ACCESS_VIDEO_PROCESS_READ | + D3D12_BARRIER_ACCESS_VIDEO_PROCESS_WRITE | + D3D12_BARRIER_ACCESS_VIDEO_ENCODE_READ | + D3D12_BARRIER_ACCESS_VIDEO_ENCODE_WRITE), + [D3D12_COMMAND_LIST_TYPE_COMPUTE] = (D3D12_BARRIER_ACCESS_CONSTANT_BUFFER | + D3D12_BARRIER_ACCESS_UNORDERED_ACCESS | + D3D12_BARRIER_ACCESS_SHADER_RESOURCE | + D3D12_BARRIER_ACCESS_INDIRECT_ARGUMENT | + D3D12_BARRIER_ACCESS_PREDICATION | + D3D12_BARRIER_ACCESS_COPY_DEST | + D3D12_BARRIER_ACCESS_COPY_SOURCE | + D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ | + D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE), + [D3D12_COMMAND_LIST_TYPE_COPY] = D3D12_BARRIER_ACCESS_COPY_SOURCE | D3D12_BARRIER_ACCESS_COPY_DEST, +}; + static VkResult dzn_cmd_buffer_create(const VkCommandBufferAllocateInfo *info, VkCommandBuffer *out) @@ -481,6 +518,8 @@ dzn_cmd_buffer_create(const VkCommandBufferAllocateInfo *info, (void)ID3D12GraphicsCommandList_QueryInterface(cmdbuf->cmdlist, &IID_ID3D12GraphicsCommandList8, (void **)&cmdbuf->cmdlist8); cmdbuf->type = type; + cmdbuf->valid_sync = cmd_buffer_valid_sync[type]; + cmdbuf->valid_access = cmd_buffer_valid_access[type]; out: if (result != VK_SUCCESS) dzn_cmd_buffer_destroy(&cmdbuf->vk); diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index d58bb60d42c..3f51f5bad57 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -2637,11 +2637,25 @@ dzn_buffer_create(struct dzn_device *device, buf->desc.SampleDesc.Quality = 0; buf->desc.Flags = D3D12_RESOURCE_FLAG_NONE; buf->desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + buf->valid_access = + D3D12_BARRIER_ACCESS_VERTEX_BUFFER | + D3D12_BARRIER_ACCESS_CONSTANT_BUFFER | + D3D12_BARRIER_ACCESS_INDEX_BUFFER | + D3D12_BARRIER_ACCESS_SHADER_RESOURCE | + D3D12_BARRIER_ACCESS_STREAM_OUTPUT | + D3D12_BARRIER_ACCESS_INDIRECT_ARGUMENT | + D3D12_BARRIER_ACCESS_PREDICATION | + D3D12_BARRIER_ACCESS_COPY_DEST | + D3D12_BARRIER_ACCESS_COPY_SOURCE | + D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_READ | + D3D12_BARRIER_ACCESS_RAYTRACING_ACCELERATION_STRUCTURE_WRITE; if (buf->usage & (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | - VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) + VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) { buf->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; + buf->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS; + } *out = dzn_buffer_to_handle(buf); return VK_SUCCESS; diff --git a/src/microsoft/vulkan/dzn_image.c b/src/microsoft/vulkan/dzn_image.c index 9dc97c16137..033c6277f47 100644 --- a/src/microsoft/vulkan/dzn_image.c +++ b/src/microsoft/vulkan/dzn_image.c @@ -127,6 +127,8 @@ dzn_image_create(struct dzn_device *device, vk_image_init(&device->vk, &image->vk, pCreateInfo); enum pipe_format pfmt = vk_format_to_pipe_format(image->vk.format); + image->valid_access = D3D12_BARRIER_ACCESS_COPY_SOURCE | D3D12_BARRIER_ACCESS_COPY_DEST; + if (image->vk.tiling == VK_IMAGE_TILING_LINEAR) { /* Treat linear images as buffers: they should only be used as copy * src/dest, and CopyTextureResource() can manipulate buffers. @@ -194,6 +196,9 @@ dzn_image_create(struct dzn_device *device, image->desc.MipLevels = pCreateInfo->mipLevels; image->desc.SampleDesc.Count = pCreateInfo->samples; image->desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; + image->valid_access |= D3D12_BARRIER_ACCESS_RESOLVE_DEST | + D3D12_BARRIER_ACCESS_SHADER_RESOURCE | + (pCreateInfo->samples > 1 ? D3D12_BARRIER_ACCESS_RESOLVE_SOURCE : 0); } if ((image->vk.create_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) && @@ -209,19 +214,27 @@ dzn_image_create(struct dzn_device *device, image->desc.Flags = D3D12_RESOURCE_FLAG_NONE; - if (image->vk.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + if (image->vk.usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; + image->valid_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET; + } if (image->vk.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; + image->valid_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_READ | + D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE; if (!(image->vk.usage & (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | - VK_IMAGE_USAGE_TRANSFER_SRC_BIT))) + VK_IMAGE_USAGE_TRANSFER_SRC_BIT))) { image->desc.Flags |= D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE; - } else if (image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) + image->valid_access &= ~D3D12_BARRIER_ACCESS_SHADER_RESOURCE; + } + } else if (image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) { image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; + image->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS; + } /* Images with TRANSFER_DST can be cleared or passed as a blit/resolve * destination. Both operations require the RT or DS cap flags. @@ -233,10 +246,13 @@ dzn_image_create(struct dzn_device *device, dzn_physical_device_get_format_support(pdev, pCreateInfo->format); if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_RENDER_TARGET) { image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; + image->valid_access |= D3D12_BARRIER_ACCESS_RENDER_TARGET; } else if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_DEPTH_STENCIL) { image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; + image->valid_access |= D3D12_BARRIER_ACCESS_DEPTH_STENCIL_WRITE; } else if (dfmt_info.Support1 & D3D12_FORMAT_SUPPORT1_TYPED_UNORDERED_ACCESS_VIEW) { image->desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS; + image->valid_access |= D3D12_BARRIER_ACCESS_UNORDERED_ACCESS; } } diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h index 7efca613e0a..7e354e832a0 100644 --- a/src/microsoft/vulkan/dzn_private.h +++ b/src/microsoft/vulkan/dzn_private.h @@ -595,6 +595,8 @@ struct dzn_cmd_buffer { ID3D12GraphicsCommandList8 *cmdlist8; D3D12_COMMAND_LIST_TYPE type; + D3D12_BARRIER_SYNC valid_sync; + D3D12_BARRIER_ACCESS valid_access; }; struct dzn_descriptor_pool { @@ -891,6 +893,8 @@ struct dzn_image { VkDeviceSize mem_offset; uint32_t castable_format_count; DXGI_FORMAT *castable_formats; + + D3D12_BARRIER_ACCESS valid_access; }; bool @@ -972,6 +976,8 @@ struct dzn_buffer { VkBufferCreateFlags create_flags; VkBufferUsageFlags usage; + + D3D12_BARRIER_ACCESS valid_access; }; DXGI_FORMAT